Bagaimana cara mengulang (kunci, nilai) dalam javascript?

335

Saya memiliki kamus yang memiliki format

dictionary = {0: {object}, 1:{object}, 2:{object}}

Bagaimana saya bisa mengulangi kamus ini dengan melakukan sesuatu seperti

for((key,value) in dictionary){
  //Do stuff where key would be 0 and value would be the object
}
nbroeking
sumber
3
for (let [key, value] of Object.entries(obj)), butuh Babel.
Elclanrs
1
@elclanrs Ada di ES2016 dan belum distandarisasi :-)
thefourtheye
@ooagain, ini bukan array dalam pertanyaan ini.
zangw

Jawaban:

480

tl; dr

  1. Dalam ECMAScript 5, itu tidak mungkin.
  2. Dalam ECMAScript 2015, dimungkinkan dengan Maps.
  3. Dalam ECMAScript 2017, sudah tersedia.

ECMAScript 5:

Tidak, ini tidak mungkin dengan objek.

Anda harus beralih dengan for..in, atau Object.keys, seperti ini

for (var key in dictionary) {
    // check if the property/key is defined in the object itself, not in parent
    if (dictionary.hasOwnProperty(key)) {           
        console.log(key, dictionary[key]);
    }
}

Catatan: The ifkondisi di atas diperlukan, hanya jika Anda ingin iterate sifat yang dictionaryobjek sangat sendiri. Karenafor..in akan beralih melalui semua properti enumerable yang diwarisi.

Atau

Object.keys(dictionary).forEach(function(key) {
    console.log(key, dictionary[key]);
});

ECMAScript 2015

Di ECMAScript 2015, Anda bisa menggunakan Mapobjek dan beralih dengan Map.prototype.entries. Mengutip contoh dari halaman itu,

var myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

var mapIter = myMap.entries();

console.log(mapIter.next().value); // ["0", "foo"]
console.log(mapIter.next().value); // [1, "bar"]
console.log(mapIter.next().value); // [Object, "baz"]

Atau beralih dengan for..of, seperti ini

'use strict';

var myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

for (const entry of myMap.entries()) {
  console.log(entry);
}

Keluaran

[ '0', 'foo' ]
[ 1, 'bar' ]
[ {}, 'baz' ]

Atau

for (const [key, value] of myMap.entries()) {
  console.log(key, value);
}

Keluaran

0 foo
1 bar
{} baz

ECMAScript 2017

ECMAScript 2017 akan memperkenalkan fungsi baru Object.entries. Anda dapat menggunakan ini untuk mengulangi objek seperti yang Anda inginkan.

'use strict';

const object = {'a': 1, 'b': 2, 'c' : 3};
for (const [key, value] of Object.entries(object)) {
  console.log(key, value);
}

Keluaran

a 1
b 2
c 3
thethourtheye
sumber
1
Keraguan dasar di sini. Saya mendarat di sini mencari cara melakukan ini di node.js, yang merupakan javascript di sisi server. Bagaimana saya tahu versi ES mana yang berlaku dalam kasus saya. Juga, dalam kasus pengguna javascript biasa, apa cara yang tepat untuk mendukung karena saya mengerti bahwa versi ES tergantung pada browser klien?
Sandeepan Nath
2
@SandeepanNath Anda dapat menggunakan situs web seperti node.green untuk mengetahui apakah fitur ES tertentu didukung di Node.js. Sejauh menyangkut browser, orang umumnya menargetkan versi yang didukung secara luas, dalam hal ini, ES5. Terlepas dari ini, transpiler (seperti Babel ) membantu mengubah kode ES2015 + menjadi ES5.
thefourtheye
1
Saya suka Object.keys(dictionary).forEach(function(key) {…sangat mudah dibaca, dan kompatibel.
ctrl-alt-delor
6
Object.entries(object).forEach(([key, val]) => {...});
Krimson
Solusi ECMAScript 2015 di atas melemparkan "TypeScript dan Iterator: Ketik 'IterableIterator <T>' bukan tipe array" tetapi polos myMap (). Foreach () bekerja dengan baik.
ttugates
60

Coba ini:

dict = {0:{1:'a'}, 1:{2:'b'}, 2:{3:'c'}}
for (var key in dict){
  console.log( key, dict[key] );
}

0 Object { 1="a"}
1 Object { 2="b"}
2 Object { 3="c"}
alex10
sumber
42

The Object.entries()Metode telah ditentukan dalam ES2017 (dan didukung di semua browser modern ):

for (const [ key, value ] of Object.entries(dictionary)) {
    // do something with `key` and `value`
}

Penjelasan:

  • Object.entries()mengambil objek seperti { a: 1, b: 2, c: 3 }dan mengubahnya menjadi sebuah array dari pasangan kunci-nilai: [ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ].

  • Dengan for ... ofkita dapat mengulang entri dari array yang dibuat.

  • Karena kami dijamin bahwa masing-masing item array yang diiterasi itu sendiri merupakan array dua entri, kami dapat menggunakan destrstruktur untuk secara langsung menetapkan variabel keydan valueke item pertama dan kedua.

Loilo
sumber
Yang menyedihkan adalah bahwa orang masih menggunakan Internet Explorer
Edward
Saya sadar sekali. Babel dan polyfill.io menyelesaikan ini, tetapi jauh dari menyenangkan.
Loilo
19

Anda dapat melakukan sesuatu seperti ini:

dictionary = {'ab': {object}, 'cd':{object}, 'ef':{object}}
var keys = Object.keys(dictionary);

for(var i = 0; i < keys.length;i++){
   //keys[i] for key
   //dictionary[keys[i]] for the value
}
Dhaval Chaudhary
sumber
3
Cantik! Saya suka bagaimana jawaban Anda bekerja di ECMAscript 5 meskipun jawaban yang diterima dan paling dipilih mengatakan itu tidak mungkin. Anda layak mendapatkan lebih banyak upvotes.
liljoshu
18

Coba ini:

var value;
for (var key in dictionary) {
    value = dictionary[key];
    // your code here...
}
AMACB
sumber
9

SELAMAT DATANG DI 2020 * Air liur di ES6 *

Ada beberapa jawaban yang cukup lama di sini - manfaatkan perusakan. Menurut pendapat saya ini tanpa diragukan lagi cara terbaik (sangat mudah dibaca) untuk beralih objek.

Object.entries(myObject).forEach(([k,v]) => {
    console.log("The key: ",k)
    console.log("The value: ",v)
})
Steve
sumber
Hanya sebuah catatan: jika Anda mengganti forEachdengan yang di mapatas, maka dimungkinkan untuk mengumpulkan nilai. mapkemudian akan mengembalikan daftar nilai-nilai tersebut, sehingga berpotensi menyederhanakan kode dengan cara lain.
Lazerbeak12345
1

menggunakan swagger-ui.js

kamu bisa melakukan ini -

_.forEach({ 'a': 1, 'b': 2 }, function(n, key) {
    console.log(n, key);
 });
Deeshank
sumber
0

Anda dapat menggunakan skrip di bawah ini.

var obj={1:"a",2:"b",c:"3"};
for (var x=Object.keys(obj),i=0;i<x.length,key=x[i],value=obj[key];i++){
    console.log(key,value);
}

output
1 a
2 b
c 3

Michael Piper
sumber
#will output #c 3 # 1 a # 2 b
Michael Piper
4
Pertimbangkan untuk menambahkan penjelasan pada jawaban Anda, kode saja kurang bermanfaat. Juga, Anda dapat mengedit jawaban Anda, komentar tidak dimaksudkan sebagai perpanjangan dari jawaban dalam cara Anda menggunakannya
Viktor
0

Sebagai peningkatan pada jawaban yang diterima, untuk mengurangi bersarang, Anda bisa melakukan ini, asalkan kuncinya tidak diwarisi:

for (var key in dictionary) {
    if (!dictionary.hasOwnProperty(key)) {
        continue;
    }
    console.log(key, dictionary[key]);
}

Edit: info tentang Object.hasOwnProperty di sini

Kloddant
sumber