Rumah  >  Soal Jawab  >  teks badan

Lintas struktur bersarang objek dan tatasusunan JavaScript menggunakan laluan rentetan

<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粉897881626P粉897881626431 hari yang lalu385

membalas semua(2)saya akan balas

  • P粉720716934

    P粉7207169342023-08-16 19:39:27

    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'

    balas
    0
  • P粉733166744

    P粉7331667442023-08-16 14:08:25

    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.

    balas
    0
  • Batalbalas