Persiapan
JavaScript hanya memiliki satu tipe data yang dapat berisi banyak nilai: Objek . Sebuah Array adalah bentuk khusus dari objek.
(Biasa) Objek memiliki bentuk
{key: value, key: value, ...}
Array memiliki formulir
[value, value, ...]
Baik array dan objek memperlihatkan key -> value
struktur. Kunci dalam array harus berupa angka, sedangkan string apa pun dapat digunakan sebagai kunci dalam objek. Pasangan kunci-nilai juga disebut "properti" .
Properti dapat diakses menggunakan notasi titik
const value = obj.someProperty;
atau notasi braket , jika nama properti tidak akan menjadi nama pengidentifikasi JavaScript yang valid [spec] , atau namanya adalah nilai dari variabel:
// 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];
Karena alasan itu, elemen array hanya dapat diakses menggunakan notasi braket:
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 adalah representasi data tekstual, seperti XML, YAML, CSV, dan lainnya. Untuk bekerja dengan data tersebut, pertama-tama harus dikonversi ke tipe data JavaScript, yaitu array dan objek (dan cara bekerja dengan itu baru saja dijelaskan). Bagaimana cara menguraikan JSON dijelaskan dalam pertanyaan Parse JSON dalam JavaScript? .
Bahan bacaan lebih lanjut
Cara mengakses array dan objek adalah pengetahuan JavaScript yang mendasar dan oleh karena itu disarankan untuk membaca Panduan JavaScript MDN , terutama bagian-bagiannya
Mengakses struktur data bersarang
Struktur data bersarang adalah array atau objek yang merujuk ke array atau objek lain, yaitu nilainya adalah array atau objek. Struktur tersebut dapat diakses dengan menerapkan notasi titik atau braket secara berurutan.
Berikut ini sebuah contoh:
const data = {
code: 42,
items: [{
id: 1,
name: 'foo'
}, {
id: 2,
name: 'bar'
}]
};
Mari kita asumsikan kita ingin mengakses name
item kedua.
Inilah cara kita melakukannya langkah demi langkah:
Seperti yang dapat kita lihat data
adalah objek, maka kita dapat mengakses propertinya menggunakan notasi titik. The items
properti diakses sebagai berikut:
data.items
Nilainya adalah sebuah array, untuk mengakses elemen keduanya, kita harus menggunakan notasi braket:
data.items[1]
Nilai ini adalah objek dan kami menggunakan notasi titik lagi untuk mengakses name
properti. Jadi kami akhirnya mendapatkan:
const item_name = data.items[1].name;
Atau, kami dapat menggunakan notasi braket untuk salah satu properti, terutama jika nama tersebut mengandung karakter yang membuatnya tidak valid untuk penggunaan notasi titik:
const item_name = data['items'][1]['name'];
Saya mencoba mengakses properti tetapi saya hanya mendapatkan undefined
kembali?
Sebagian besar waktu ketika Anda mendapatkan undefined
, objek / array tidak memiliki properti dengan nama itu.
const foo = {bar: {baz: 42}};
console.log(foo.baz); // undefined
Gunakan console.log
atau console.dir
dan periksa struktur objek / array. Properti yang Anda coba akses mungkin sebenarnya ditentukan pada objek / array bersarang.
console.log(foo.bar.baz); // 42
Bagaimana jika nama properti dinamis dan saya tidak mengetahuinya sebelumnya?
Jika nama properti tidak diketahui atau kami ingin mengakses semua properti dari suatu objek / elemen array, kita dapat menggunakan loop for...in
[MDN] untuk objek dan loop for
[MDN] untuk array untuk beralih ke semua properti / elemen.
Benda
Untuk mengulangi semua properti dari data
, kita dapat beralih di atas objek seperti:
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 dari mana objek itu berasal (dan apa yang ingin Anda lakukan), Anda mungkin harus menguji di setiap iterasi apakah properti itu benar-benar properti objek, atau properti warisan. Anda dapat melakukan ini dengan Object#hasOwnProperty
[MDN] .
Sebagai alternatif for...in
dengan hasOwnProperty
, Anda dapat menggunakan Object.keys
[MDN] untuk mendapatkan berbagai nama properti :
Object.keys(data).forEach(function(prop) {
// `prop` is the property name
// `data[prop]` is the property value
});
Array
Untuk beralih ke semua elemen data.items
array , kami menggunakan for
loop:
for(let i = 0, l = data.items.length; i < l; i++) {
// `i` will take on the values `0`, `1`, `2`,..., i.e. in each iteration
// we can access the next element in the array with `data.items[i]`, example:
//
// var obj = data.items[i];
//
// Since each element is an object (in our example),
// we can now access the objects properties with `obj.id` and `obj.name`.
// We could also use `data.items[i].id`.
}
Kita juga bisa menggunakannya for...in
untuk beralih pada array, tetapi ada alasan mengapa ini harus dihindari: Mengapa 'untuk (item dalam daftar)' dengan array dianggap praktik yang buruk dalam JavaScript? .
Dengan meningkatnya dukungan browser dari ECMAScript 5, metode array 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 lingkungan yang mendukung ES2015 (ES6), Anda juga dapat menggunakan loop [MDN] , yang tidak hanya berfungsi untuk array, tetapi untuk semua iterable :for...of
for (const item of data.items) {
// `item` is the array element, **not** the index
}
Dalam setiap iterasi, for...of
secara langsung memberi kita elemen iterable berikutnya, tidak ada "indeks" untuk diakses atau digunakan.
Bagaimana jika "kedalaman" struktur data tidak saya ketahui?
Selain kunci yang tidak dikenal, "kedalaman" dari struktur data (yaitu berapa banyak objek bersarang) yang dimilikinya, mungkin juga tidak diketahui. Cara mengakses properti yang sangat bersarang biasanya tergantung pada struktur data yang tepat.
Tetapi jika struktur data berisi pola berulang, misalnya representasi pohon biner, solusinya biasanya mencakup [Wikipedia] secara rekursif mengakses setiap tingkat struktur data.
Berikut adalah contoh untuk mendapatkan simpul daun pertama dari pohon biner:
function getLeaf(node) {
if (node.leftChild) {
return getLeaf(node.leftChild); // <- recursive call
}
else if (node.rightChild) {
return getLeaf(node.rightChild); // <- recursive call
}
else { // node must be a leaf node
return node;
}
}
const first_leaf = getLeaf(root);
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);
Cara yang lebih umum untuk mengakses struktur data bersarang dengan kunci dan kedalaman yang tidak dikenal adalah dengan menguji jenis nilai dan bertindak sesuai.
Berikut adalah contoh yang menambahkan semua nilai primitif di dalam struktur data bersarang ke dalam array (dengan asumsi itu tidak mengandung fungsi apa pun). Jika kita menemukan objek (atau array), kita cukup memanggil toArray
lagi pada nilai itu (panggilan rekursif).
function toArray(obj) {
const result = [];
for (const prop in obj) {
const value = obj[prop];
if (typeof value === 'object') {
result.push(toArray(value)); // <- recursive call
}
else {
result.push(value);
}
}
return result;
}
const data = {
code: 42,
items: [{
id: 1,
name: 'foo'
}, {
id: 2,
name: 'bar'
}]
};
function toArray(obj) {
const result = [];
for (const prop in obj) {
const value = obj[prop];
if (typeof value === 'object') {
result.push(toArray(value));
} else {
result.push(value);
}
}
return result;
}
console.log(toArray(data));
Pembantu
Karena struktur objek atau array yang kompleks belum tentu jelas, kita dapat memeriksa nilai pada setiap langkah untuk memutuskan bagaimana bergerak lebih jauh. console.log
[MDN] dan console.dir
[MDN] membantu kami melakukan ini. Misalnya (output dari konsol Chrome):
> console.log(data.items)
[ Object, Object ]
Di sini kita melihat bahwa itu data.items
adalah array dengan dua elemen yang keduanya objek. Di konsol Chrome objek bahkan dapat diperluas dan diperiksa segera.
> console.log(data.items[1])
Object
id: 2
name: "bar"
__proto__: Object
Ini memberi tahu kita bahwa itu data.items[1]
adalah objek, dan setelah meluaskannya kita melihat bahwa ia memiliki tiga properti id
,, name
dan __proto__
. Yang terakhir adalah properti internal yang digunakan untuk rantai prototipe objek. Rantai prototipe dan warisan tidak termasuk dalam cakupan untuk jawaban ini.