Javascript'te yineleme (anahtarlar, değerler) nasıl yapılır?


335

Biçiminde bir sözlük var

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

Gibi bir şey yaparak bu sözlüğü nasıl tekrarlayabilirim

for((key,value) in dictionary){
  //Do stuff where key would be 0 and value would be the object
}

3
for (let [key, value] of Object.entries(obj))Babil'e ihtiyacım var.
elclanrs


1
@ elclanrs Onun ES2016 ve henüz standart değil :-)
thefourtheye


@dooagain, bu soruda bir dizi değil.
zangw

Yanıtlar:


479

tl; Dr.

  1. ECMAScript 5'te, bu mümkün değildir.
  2. ECMAScript 2015'te Maps ile mümkündür .
  3. ECMAScript 2017'de, kullanıma hazır olacaktı.

ECMAScript 5:

Hayır, nesnelerle mümkün değil.

Ya tekrar etmelisin for..in, ya da Object.keysböyle

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]);
    }
}

Not: Yukarıdaki ifkoşul, yalnızca dictionarynesnenin kendisine ait özellikleri yinelemek istiyorsanız gereklidir . Çünkü for..inmiras alınan tüm numaralandırılabilir özellikleri tekrarlayacaktır.

Veya

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

ECMAScript 2015

ECMAScript 2015'te Mapnesneleri kullanabilir ve nesnelerle birlikte yineleyebilirsiniz Map.prototype.entries. Söz konusu sayfadan örnek alıntı yapıldığında,

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"]

Veya for..ofbunun gibi tekrarla

'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);
}

Çıktı

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

Veya

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

Çıktı

0 foo
1 bar
{} baz

ECMAScript 2017

ECMAScript 2017 yeni bir işlev getirecek Object.entries. Nesneyi istediğiniz gibi yinelemek için bunu kullanabilirsiniz.

'use strict';

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

Çıktı

a 1
b 2
c 3

1
Burada temel bir şüphe. Buraya nasıl sunucu tarafında javascript olan node.js, bunu aramak için indi. Benim durumumda hangi ES sürümünün geçerli olduğunu nasıl bilebilirim? Ayrıca, düzenli javascript kullanıcıları durumunda, ES sürümünün istemcinin tarayıcısına bağlı olduğunu anladığım için desteklemenin doğru yolu nedir?
Sandeepan Nath

2
@SandeepanNath Düğümünüzde belirli bir ES özelliğinin desteklenip desteklenmediğini öğrenmek için node.green gibi web sitelerini kullanabilirsiniz . Tarayıcılar söz konusu olduğunda, insanlar genellikle yaygın olarak desteklenen sürümü, bu durumda ES5'i hedefler. Bunun dışında transpiller ( Babel gibi ) ES2015 + kodunu ES5'e dönüştürmeye yardımcı olur.
thefourtheye

1
Sevdiğim Object.keys(dictionary).forEach(function(key) {…çok okunabilir ve uyumlu.
ctrl-alt-delor

6
Object.entries(object).forEach(([key, val]) => {...});
Krimson

ECMAScript 2015 çözümü yukarıdaki "TypeScript ve Iterator: Type 'IterableIterator <T>' bir dizi türü değil" ama düz ol myMap (). Foreach () iyi çalıştı.
ttugates

60

Bunu dene:

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"}

42

Object.entries()Yöntem ES2017 belirtilen edilmiştir (ve tüm modern tarayıcılarda desteklenir ):

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

Açıklama:

  • Object.entries()gibi bir nesne alır { a: 1, b: 2, c: 3 }ve anahtar değer çiftleri bir dizi haline dönüşür: [ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ].

  • İle for ... ofoluşturulan dizinin girişleri üzerinde döngü.

  • Bu şekilde yinelenen dizi öğelerinin her birinin kendisinin iki girişli bir dizi olduğu garanti edildiğinden, doğrudan değişkenleri atamak ve birinci ve ikinci öğesine yıkım işlevini kullanabiliriz .keyvalue


Üzücü olan şey, insanların hala Internet Explorer
Edward

Acı verici bir şekilde farkındayım. Babel ve polyfill.io bunu çözüyor, ama zevkli olmaktan çok uzak.
Loilo

19

Bunun gibi bir şey yapabilirsiniz:

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
}

3
Güzel! Kabul edilmeyen ve en çok oylanan cevabın mümkün olmadığını söylese de cevabınızın ECMAscript 5'te nasıl çalıştığını seviyorum. Çok daha fazla oyu hak ediyorsun.
liljoshu

18

Bunu dene:

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

9

2020'YE HOŞGELDİNİZ * ES6'daki Drools *

Burada oldukça eski bazı cevaplar var - yıkımdan yararlanın. Kanımca bu bir nesneyi yinelemenin en güzel (çok okunabilir) yoludur.

Object.entries(myObject).forEach(([k,v]) => {
    console.log("The key: ",k)
    console.log("The value: ",v)
})

Sadece bir not: değiştirirseniz forEachile mapşeyden önce, agrega değerlere sonra mümkündür. mapdaha sonra söz konusu değerlerin bir listesini döndürür, böylece kodu başka şekillerde basitleştirebilir.
Lazerbeak12345


1

swagger-ui.js kullanma

Bunu yapabilirsiniz -

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

0

Aşağıdaki komut dosyasını kullanabilirsiniz.

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);
}

çıkışlar
1 a
2 b
c 3


#will çıktı #c 3 # 1 a # 2 b
Michael Piper

4
Cevabınıza bir açıklama eklemeyi düşünün, sadece kod daha az yardımcı olur. Ayrıca, cevabınızı düzenleyebilirsiniz, yorumlar onları kullandığınız şekilde cevabın bir uzantısı değildir
Viktor

0

Kabul edilen yanıtta bir iyileştirme olarak, iç içe geçirmeyi azaltmak için, anahtarın miras alınmaması şartıyla bunu yapabilirsiniz:

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

Düzenleme: burada hakkında bilgiObject.hasOwnProperty

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.