Lintas struktur bersarang objek dan tatasusunan JavaScript menggunakan laluan rentetan
P粉897881626
P粉897881626 2023-08-15 21:01:19
0
2
430
<p>Saya mempunyai struktur data seperti ini:</p> <pre class="brush:php;toolbar:false;">var someObject = { 'bahagian 1' : { 'nama': 'Bahagian 1', 'saiz': '20', 'qty' : '50' }, 'bahagian 2' : { 'nama': 'Bahagian 2', 'saiz': '15', 'qty' : '60' }, 'bahagian3' : [ { 'nama': 'Bahagian 3A', 'saiz': '10', 'qty' : '20' }, { 'nama': 'Bahagian 3B', 'saiz': '5', 'qty' : '20' }, { 'nama': 'Bahagian 3C', 'saiz': '7.5', 'qty' : '20' } ] };</pre> <p>Saya mahu mengakses data menggunakan pembolehubah berikut: </p> <pre class="brush:php;toolbar:false;">var part1name = "part1.name"; var part2quantity = "part2.qty"; var part3name1 = "part3[0].name";</pre> <p>part1name hendaklah diisi dengan nilai <code>someObject.part1.name</code>, iaitu "Bahagian 1". Begitu juga dengan part2quantity, yang berlapik hingga 60. </p> <p>Adakah terdapat cara untuk mencapai ini menggunakan JavaScript atau JQuery tulen? </p>
P粉897881626
P粉897881626

membalas semua(2)
P粉720716934

Ini kini disokong melalui lodash menggunakan _.get(obj, property). Sila rujuk https://lodash.com/docs#get

Contoh daripada dokumentasi:

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');
// → 3

_.get(object, ['a', '0', 'b', 'c']);
// → 3

_.get(object, 'a.b.c', 'default');
// → 'default'
P粉733166744

Saya baru saja mencipta ini berdasarkan beberapa kod serupa yang telah saya miliki dan ia nampaknya berfungsi:

Object.byString = function(o, s) {
    s = s.replace(/\[(\w+)\]/g, '.'); // 将索引转换为属性
    s = s.replace(/^\./, '');           // 去掉前导点
    var a = s.split('.');
    for (var i = 0, n = a.length; i < n; ++i) {
        var k = a[i];
        if (k in o) {
            o = o[k];
        } else {
            return;
        }
    }
    return o;
}

Penggunaan:

Object.byString(someObj, 'part3[0].name');

Lihat contoh yang berfungsi di http://jsfiddle.net/alnitak/hEsys/.

EDIT Sesetengah orang menyedari bahawa kod ini akan membuang ralat jika lulus rentetan di mana indeks paling kiri tidak sepadan dengan entri bersarang betul dalam objek. Ini adalah kebimbangan yang sah, tetapi saya rasa lebih baik menggunakan try / catch块来处理,而不是使这个函数静默地返回undefined semasa membuat panggilan.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan