Bagaimana untuk mengakses dan mengendalikan objek bersarang, tatasusunan atau JSON?
P粉864872812
P粉864872812 2023-10-09 19:02:22
0
2
560

Saya mempunyai struktur data bersarang yang mengandungi objek dan tatasusunan. Bagaimana untuk mengekstrak maklumat, iaitu mengakses nilai tertentu atau berbilang (atau kunci)?

Contohnya:

var data = {
    code: 42,
    items: [{
        id: 1,
        name: 'foo'
    }, {
        id: 2,
        name: 'bar'
    }]
};

Bagaimana untuk mengaksesitems中第二项的name?

P粉864872812
P粉864872812

membalas semua(2)
P粉476547076

Anda boleh mengaksesnya dengan cara ini

data.items[1].name

atau

data["items"][1]["name"]

Kedua-dua kaedah adalah sama.

P粉002023326

Pengetahuan awal

JavaScript hanya mempunyai satu jenis data yang boleh mengandungi berbilang nilai: Objek. Array ialah satu bentuk objek yang istimewa.

(Normal) objek mempunyai bentuk berikut

{key: value, key: value, ...}

Bentuk tatasusunan ialah

[value, value, ...]

Tatasusunan dan objek kedua-duanya mendedahkan struktur key -> value. Kekunci dalam tatasusunan mestilah nombor, manakala sebarang rentetan boleh digunakan sebagai kunci dalam objek. Pasangan nilai kunci juga dipanggil "sifat".

Sifat boleh diakses menggunakan notasi titik

const value = obj.someProperty;

atau notasi kurungan, jika nama sifat bukan JavaScript yang sah nama pengecam​​[spesifikasi], atau jika nama itu ialah nilai pembolehubah:

// the space is not a valid character in identifier names
const value = obj["some Property"];

// property name as variable
const name = "some Property";
const value = obj[name];

Oleh itu, elemen tatasusunan hanya boleh diakses menggunakan notasi kurungan:

const value = arr[5]; // arr.5 would be a syntax error

// property name / index as variable
const x = 5;
const value = arr[x];

Tunggu...bagaimana dengan JSON?

JSON ialah perwakilan teks data, sama seperti XML, YAML, CSV, dll. Untuk memproses data sedemikian, anda perlu menukarnya terlebih dahulu kepada jenis data JavaScript, iaitu tatasusunan dan objek (cara memproses data ini baru dijelaskan). Soalan Menghuraikan JSON dalam JavaScript? Cara menghuraikan JSON dijelaskan dalam .

Bahan bacaan lanjut

Cara mengakses tatasusunan dan objek adalah asas JavaScript, jadi disyorkan untuk membaca Panduan JavaScript MDN, terutamanya pelbagai bahagian



Akses struktur data bersarang

Struktur data bersarang ialah tatasusunan atau objek yang merujuk tatasusunan atau objek lain, iaitu nilainya ialah tatasusunan atau objek. Struktur sedemikian boleh diakses dengan aplikasi berturut-turut notasi titik atau kurungan.

Berikut adalah contoh:

const data = {
    code: 42,
    items: [{
        id: 1,
        name: 'foo'
    }, {
        id: 2,
        name: 'bar'
    }]
};

Katakan kita mahu mengakses item kedua 名称.

Begini cara kami melakukannya langkah demi langkah:

Seperti yang kita lihat, data 是一个对象,因此我们可以使用点表示法访问其属性。 items sifat diakses seperti berikut:

data.items

Nilai ialah tatasusunan dan untuk mengakses elemen keduanya, kita perlu menggunakan notasi kurungan:

data.items[1]

Nilai ini ialah objek, dan sekali lagi kami menggunakan notasi titik untuk mengakses sifat name. Jadi kita berakhir dengan:

const item_name = data.items[1].name;

Sebagai alternatif, kita boleh menggunakan notasi kurungan untuk sebarang atribut, terutamanya jika nama itu mengandungi aksara yang menjadikannya tidak sah untuk notasi titik:

const item_name = data['items'][1]['name'];

Saya cuba mengakses hartanah tetapi saya hanya mendapat undefined maklumat?

Kebanyakan masa apabila anda menghadapi 未定义, objek/susunan tidak mempunyai sifat dengan nama itu.

const foo = {bar: {baz: 42}};
console.log(foo.baz); // undefined

Gunakan console.logconsole.dir dan semak struktur objek/susunan. Ada kemungkinan bahawa harta yang anda cuba akses sebenarnya ditakrifkan pada objek/tatasusunan bersarang.

console.log(foo.bar.baz); // 42

Bagaimana jika nama hartanah adalah dinamik dan saya tidak mengenalinya terlebih dahulu?

Jika nama sifat tidak diketahui atau kami ingin mengakses semua sifat objek/elemen tatasusunan, kami boleh menggunakan tatasusunan gelung for...in [MDN] 循环对象和 for [MDN] untuk melelaran ke atas semua sifat/elemen.

objek

Untuk lelaran ke atas semua sifat data, kita boleh lelaran ke atas objek seperti berikut:

for (const prop in data) {
    // `prop` contains the name of each property, i.e. `'code'` or `'items'`
    // consequently, `data[prop]` refers to the value of each property, i.e.
    // either `42` or the array
}

Bergantung pada asal objek itu (dan perkara yang anda mahu lakukan), anda mungkin perlu menguji pada setiap lelaran sama ada harta itu sememangnya harta objek atau harta warisan. Anda boleh menggunakan Object#hasOwnProperty代码> [MDN].

Sebagai alternatif kepada for...inhasOwnProperty 的替代方案,您可以使用 Object.keysuntuk...dalam dan hasOwnProperty, anda boleh menggunakan Object.keys [MDN] Dapatkan

susunan nama atribut

:

Object.keys(data).forEach(function(prop) {
  // `prop` is the property name
  // `data[prop]` is the property value
});

susun

data.items 数组 的所有元素,我们使用 for

Untuk mengulangi semua elemen

data.items for...inarray, kami menggunakan gelung for:

for(let i = 0, l = data.items.length; i 

Anda juga boleh menggunakan for...in untuk mengulangi tatasusunan, tetapi terdapat beberapa sebab mengapa perkara ini harus dielakkan: forEachMengapa menggunakan "for(var item in list)" dengan tatasusunan dalam JavaScript adalah dianggap cara yang tidak baik? . Memandangkan sokongan pelayar untuk ECMAScript 5 terus berkembang, kaedah tatasusunan forEach

🎜[MDN]🎜🎜🎜 juga menjadi alternatif yang menarik: 🎜
data.items.forEach(function(value, index, array) {
    // The callback is executed for each element in the array.
    // `value` is the element itself (equivalent to `array[index]`)
    // `index` will be the index of the element in the array
    // `array` is a reference to the array itself (i.e. `data.items` in this case)
});

Dalam persekitaran yang menyokong ES2015 (ES6), anda juga boleh menggunakan gelung for...of [MDN], yang berfungsi bukan sahaja dengan tatasusunan, tetapi dengan mana-mana objek Iterable:

for (const item of data.items) {
   // `item` is the array element, **not** the index
}
Pada setiap lelaran,

memberi kita elemen seterusnya bagi lelaran secara langsung, tanpa "indeks" untuk diakses atau digunakan. for...of


Bagaimana jika saya tidak mengetahui "kedalaman" struktur data?

Selain kekunci yang tidak diketahui, "kedalaman" struktur data (iaitu berapa banyak objek bersarang terdapat) mungkin juga tidak diketahui. Cara anda mengakses sifat bersarang dalam selalunya bergantung pada struktur data yang tepat.

Tetapi jika struktur data mengandungi corak berulang, seperti perwakilan pokok binari, penyelesaian biasanya melibatkan

rekursi [Wikipedia]mengakses setiap peringkat struktur data.

Berikut ialah contoh mendapatkan nod daun pertama pokok binari:

function getLeaf(node) {
    if (node.leftChild) {
        return getLeaf(node.leftChild); // 

const root = {
    leftChild: {
        leftChild: {
            leftChild: null,
            rightChild: null,
            data: 42
        },
        rightChild: {
            leftChild: null,
            rightChild: null,
            data: 5
        }
    },
    rightChild: {
        leftChild: {
            leftChild: null,
            rightChild: null,
            data: 6
        },
        rightChild: {
            leftChild: null,
            rightChild: null,
            data: 7
        }
    }
};
function getLeaf(node) {
    if (node.leftChild) {
        return getLeaf(node.leftChild);
    } else if (node.rightChild) {
        return getLeaf(node.rightChild);
    } else { // node must be a leaf node
        return node;
    }
}

console.log(getLeaf(root).data);
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!