Nesne özellikleri üzerinden yineleme


2040

var obj = {
    name: "Simon",
    age: "20",
    clothing: {
        style: "simple",
        hipster: false
    }
}

for(var propt in obj){
    console.log(propt + ': ' + obj[propt]);
}

Değişken proptnesnenin özelliklerini nasıl temsil eder? Bu yerleşik bir yöntem veya özellik değildir. Neden cisimdeki her özellik ile karşılaşıyor?


11
if (typeof(obj[propt]) === 'object') {/ * Tekrar yap * /}
noob

13
Bu soru için gerçekten üzgünüm. Ben bir döngü nedir biliyorum, ben şimdi temizlendi düşünüyorum bence "nesne özellikleri arasında döngü" etrafında başımı alamadım. Ayrıca, onlar bana tavsiye etti "JavaScript Adım Adım 2. Baskı - Okulda Steve Suehring.
Rafay

242
Bu iyi bir başlangıç ​​sorusu. Diğer dillerle 15 yıllık mesleki deneyimim olduğunu ve bu cevaba ihtiyacım olduğunu da ekleyeceğim. Yapabilseydim, artı 2000 olurdu.
Nathan C. Tresch

60
Çılgınca, ama bunu nasıl yapacağımla ilgili sözdizimini yeniden öğrenmek için yıllardır birkaç ayda bir bu sayfaya geliyorum. Bunu nasıl yapacağımı hatırlamıyorum ... Sadece bu sayfanın her zaman SO'da olduğunu hatırlıyorum.
HDave

14
Bu StackOverflow'da gördüğüm en garip sayfa. Soruyu dikkatlice okursanız, aslında sorulan soruları cevaplamaya çalışmak için sadece bir cevap başlar ve -6 puanı vardır. Kabul edilen en yüksek puanlama cevabı sadece cevap vermekle kalmaz, aynı zamanda yanlıştır.

Yanıtlar:


2426

Mülkler üzerinde yineleme yapmak için bu ek hasOwnPropertykontrol gereklidir :

for (var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
        // do stuff
    }
}

Bir nesnenin prototipi, nesne için teknik olarak nesnenin bir parçası olan ek özellikler içerdiğinden gereklidir. Bu ek özellikler, temel nesne sınıfından miras alınır, ancak yine de bunların özellikleridir obj.

hasOwnProperty bunun temel sınıfa miras alınan değil, bu sınıfa özgü bir özellik olup olmadığını kontrol eder.


hasOwnPropertyNesnenin kendisini aramak da mümkündür :

if (obj.hasOwnProperty(prop)) {
    // do stuff
}

Ancak, nesnenin aynı ada sahip ilgisiz bir alanı varsa bu başarısız olur:

var obj = { foo: 42, hasOwnProperty: 'lol' };
obj.hasOwnProperty('foo');  // TypeError: hasOwnProperty is not a function

Bu yüzden onu aramak daha güvenli Object.prototype:

var obj = { foo: 42, hasOwnProperty: 'lol' };
Object.prototype.hasOwnProperty.call(obj, 'foo');  // true

21
@BT Mozilla belgelerine göre : "Prototiplerine değil, yalnızca nesnenin kendisine bağlı özellikleri dikkate almak istiyorsanız, getOwnPropertyNames kullanın veya bir hasOwnProperty denetimi yapın (propertyIsEnumerable da kullanılabilir)."
davidmdem

3
Seslenmenin anlamı tam olarak nedir object.hasOwnProperty()? Herhangi bir propertydeğeri olan gerçek, içinde olduğu anlamına gelmez objectmi?
Alex S

6
Çünkü bir nesnenin prototipi olan Alex S, teknik olarak nesnenin bir parçası olan nesne için ek özellikler içerir. Temel nesne sınıfından miras alınırlar, ancak yine de özelliklerdir. hasOwnProperty, bunun temel sınıfa miras alınan değil, bu sınıfa özgü bir özellik olup olmadığını kontrol eder. İyi bir açıklama: brianflove.com/2013/09/05/javascripts-hasownproperty-method
Kyle Richter

87
Bununla birlikte, Object.keys (obj) 'ün artık nesnenin anahtarlarını almak için çok daha iyi bir çözüm olduğunu belirtmem gerektiğini hissediyorum. Mozilla belgelerine bağlantı: developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
Kyle Richter

9
Önemli bir bilgi eksik. propertyburada bir dizedir, çağrılmış olmalıydı propertyName. Aksi takdirde, benim gibi JS yeni başlayanlar için karışıklığa neden olabilir, yani if.
Neolisk

1136

JavaScript 1.8.5'ten Object.keys(obj)itibaren, nesnenin kendisinde tanımlanmış özellikler dizisi elde etmek için kullanabilirsiniz (doğru olanları obj.hasOwnProperty(key)).

Object.keys(obj).forEach(function(key,index) {
    // key: the name of the object key
    // index: the ordinal position of the key within the object 
});

Bu, for-in döngüsü kullanmaktan daha iyidir (ve daha okunabilir).

Bu tarayıcılarda desteklenir:

  • Firefox (Gecko): 4 (2.0)
  • Krom: 5
  • Internet Explorer: 9

Daha fazla bilgi için Mozilla Geliştirici Ağı Object.keys () referansına bakın.


7
Bu artık daha yaygın olarak desteklenmektedir: developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/…
Dom Vinyard

3
Eski tarayıcılar için destek gerekiyorsa, bunu kullanabilir polyfill
KyleMit

27
Bu dil yapısını destekleyen ortamlarda, bu yöntem Array.foreach'in çağrılmasına izin verir: Object.keys(myObject).forEach(function(key,index) { //key = the name of the object key //index = the ordinal position of the key within the object });
Todd Price

4
@ AJ_83 Bir forEach () öğesinden çıkmanın iyi bir yolu yoktur. Bu durumda bazı () kullanın ve kırmak için true değerini döndürün
Daniel Z.

11
neden for-in'den daha okunabilir? for candidate in candidateStatus... bana okunabilir görünüyor
Jona

309

2019'da olduğumuz kızlar ve çocuklar ve yazmak için çok zamanımız yok ... Öyleyse bu havalı yeni süslü ECMAScript 2016'yı yapalım:

Object.keys(obj).forEach(e => console.log(`key=${e}  value=${obj[e]}`));

17
Bu Danny R'in cevabından nasıl farklı?
krillgar

27
Bir oneliner ve forEach yerine harita kullanır. Ve ayrıca console.log satement bazı insanlar için ilginç olabilir.
Frank Roth

Satly, bu şu durumlarda çalışmaz obj=window.performance.memory: - / Nerede olduğu for ingibi. ievar obj = window.performance.memory; for( key in obj ) console.log( 'key=' + key + ' val=' + obj[key] );
Michaelangel007

2
window.performance.memoryyalnızca krom tarafından desteklenir ve Object.keys(obj)boş bir dizi döndürür. Bunun bir ilgisi yok .map.
Frank Roth

Kimse bu tek astarı bir seferde birden fazla şey yapmak için yeniden yapılandırmak istemezse, bu özeti egönderdim. Temelde çoğu karma uygulama gibi ve ( (key) => (value) )bunun yerine kullanır { key => value }, ancak daha önce bununla uğraşmak zorunda kalmadıysanız
kayleeFrye_onDeck

216

Bu for...in statement( MDN , ECMAScript spesifikasyonu ).

"Gibi okuyabilirsiniz İÇİN her özellik İÇİNDEobj nesne, her özellik atamak PROPT sırayla değişken".


1
Çok teşekkürler, şimdi anlıyorum. Başımı çarptım, kitaplardan ve Google'dan geçiyordum.
Rafay

21
@RightSaidFred ile Anlaştı inoperatör ve forhiç de buna dahil değildir açıklamada, for-indeyim kendi başına bir dilbilgisi üretimini temsil eder: for ( LeftHandSideExpression in Expression ),for ( var VariableDeclarationNoIn in Expression )
CMS

2
Garip bu cevabın çok fazla oyu var, özellikle de bu popüler yorumlar onunla çelişiyor gibi görünüyor.
Doug Molineux

9
Bu neden cevap olarak işaretlendi? Muhtemelen bu
konudaki

3
En az yardımcı cevap? OP'nin ne istediğini düşündüğünüze bağlıdır; soruyu ilk okuduğumda, bir değişkenin bir nesnenin özelliklerini incelemek için kullanılabileceği ve bu cevabın etkili bir şekilde açıkladığı mekanizma hakkında şaşkın bir eğlence gibi görünüyordu (buna rağmen 'in-in' yanlış isim). Soru Ben OP hasOwnProperty arıyordu ama bunu bilmiyor anlamına gelebilir bkz "Neden her özellik buluyor", ama büyük ihtimal bu OP bilmek istediği şeyi oldu ve yanlış bir doğru kabul etmiştir farklı bir soruya cevap. :-)
İnişli

157

ES'nin güncel uygulamalarında şunları kullanabilirsiniz Object.entries:

for (const [key, value] of Object.entries(obj)) { }

veya

Object.entries(obj).forEach(([key, value]) => ...)

Yalnızca değerler üzerinde yineleme yapmak istiyorsanız, Object.values ​​kullanın:

for (const value of Object.values(obj)) { }

veya

Object.values(obj).forEach(value => ...)

bu en iyi çözüm (object.entries ...) olurdu, ama kullanamam. Bunu birden çok kez yapmak istediğinizde ve bunu çerçevenizde destekleyemediğinizde, bu sayfadaki çoklu dolguyu kullanabilirsiniz: developer.mozilla.org/nl/docs/Web/JavaScript/Reference/…
Mario

Üçüncü öneri, yalnızca özelliklerin değerlerini verirseniz harikadır. Müthiş!
Ginzburg


27

Ortamınızın destekleri ise ES2017 sonra tavsiye ederim Object.entries :

Object.entries(obj).forEach(([key, value]) => {
  console.log(`${key} ${value}`);
});

Mozillas Object.entries () belgelerinde gösterildiği gibi :

Object.entries () metodu tarafından sağlanan ile aynı sırada, belirli bir nesnenin kendi numaralandırılabilir özelliği [anahtar değeri] çiftlerinin bir dizi döndürür için ... döngüsünde (fark, bir-için döngü numaralandırır prototip zincirindeki özellikler).

Temelde Object.entries ile daha eski olan for ... döngüsünde gereken aşağıdaki ek adımı kaldırabiliriz :

// This step is not necessary with Object.entries
if (object.hasOwnProperty(property)) {
  // do stuff
}

22

jquery şimdi bunu yapmanızı sağlar:

$.each( obj, function( key, value ) {
  alert( key + ": " + value );
});

1
$.each({foo:1, length:0, bar:2}, function(k,v){console.log(k,v)})$ .each nesneler için uygun değildir . Bir nesnenin length özelliğine sahip olması ve değeri sıfır olması durumunda tüm nesneye boş bir dizi gibi davranılır.
Bob Stein

Bunun neden davetkar bir yaklaşım olduğunu düşündüğüm ayrıntılar .
Bob Stein

21

Dominik'in cevabı mükemmel, sadece okumayı tercih ettiğim için bu şekilde yapmayı tercih ediyorum:

for (var property in object) {
    if (!object.hasOwnProperty(property)) continue;

    // Do stuff...
}

ObjectOlsa büyük harf o ile olmalı , değil mi?
Jonathan

18

Yukarıdaki yanıtlar biraz can sıkıcıdır, çünkü bir nesne olduğundan emin olduktan sonra for döngüsü içinde ne yaptığınızı açıklamazlar: DOĞRUDAN ERİŞMEYİNİZ! Aslında yalnızca OBJ'ye başvurmanız gereken ANAHTAR teslim edilir:

var obj = {
  a: "foo",
  b: "bar",
  c: "foobar"
};

// We need to iterate the string keys (not the objects)
for(var someKey in obj)
{
  // We check if this key exists in the obj
  if (obj.hasOwnProperty(someKey))
  {
    // someKey is only the KEY (string)! Use it to get the obj:
    var myActualPropFromObj = obj[someKey]; // Since dynamic, use [] since the key isn't literally named "someKey"

    // NOW you can treat it like an obj
    var shouldBeBar = myActualPropFromObj.b;
  }
}

Bunların hepsi ECMA5 güvenlidir. Hatta Rhino gibi topal JS sürümlerinde çalışır;)


15

ES2015'in Reflect.ownKeys(obj)özelliklerini bir yineleyici aracılığıyla kullanımını ve ayrıca yinelemeyi eklemek için .

Örneğin:

let obj = { a: 'Carrot', b: 'Potato', Car: { doors: 4 } };

tarafından tekrarlanabilir

// logs each key
Reflect.ownKeys(obj).forEach(key => console.log(key));

Bir nesnenin anahtarlarının değerleri üzerinde doğrudan yineleme yapmak isterseniz, iterator tıpkı JavaScipts'in dizeler, diziler, yazılan diziler, Harita ve Küme için varsayılan yineleyicileri gibi .

JS, olarak tanımlanması gereken varsayılan yineleyici özelliği üzerinden yineleme yapmaya çalışır Symbol.iterator.

Tüm nesneler üzerinde yineleme yapabilmek istiyorsanız, nesneyi prototip olarak ekleyebilirsiniz:

Object.prototype[Symbol.iterator] = function*() { 
    for(p of Reflect.ownKeys(this)){ yield this[p]; }
}

Bu, for ... döngüsüne sahip bir nesnenin değerlerini yinelemenize olanak tanır, örneğin:

for(val of obj) { console.log('Value is:' + val ) }

Dikkat : Bu yanıtı yazarken (Haziran 2018) IE hariç tüm diğer tarayıcılar, jeneratörleri ve for...ofyinelemeyiSymbol.iterator


OP'nin sorusunu gerçekten cevaplamasanız da, bu benim için çok yardımcı oldu, henüz Reflect hakkında bilmiyordum.
Michiel

15
if(Object.keys(obj).length) {
    Object.keys(obj).forEach(key => {
        console.log("\n" + key + ": " + obj[key]);
    });
}

// *** Explanation line by line ***

// Explaining the bellow line
// It checks if obj has at least one property. Here is how:
// Object.keys(obj) will return an array with all keys in obj
// If there is no keys in obj, it will return empty array = []
// Then it will get it's length, if it has at least one element,
// it's bigger than 0 which evaluates to true and the bellow 
// code will be executed.
// Else means it's length = 0 which evaluates to false
// NOTE: you can use Object.hasOwnProperty() instead of Object.keys(obj).length
if(Object.keys(obj).length) {

    // Explaining the bellow line
    // Just like in the previous line, this returns an array with
    // all keys in obj (because if code execution got here, it means 
    // obj has keys.) 
    // Then just invoke built-in javascript forEach() to loop
    // over each key in returned array and calls a call back function 
    // on each array element (key), using ES6 arrow function (=>)
    // Or you can just use a normal function ((key) { blah blah }).
    Object.keys(obj).forEach(key => {

        // The bellow line prints out all keys with their 
        // respective value in obj.
        // key comes from the returned array in Object.keys(obj)
        // obj[key] returns the value of key in obj
        console.log("\n" + key + ": " + obj[key]);
    });
}

3
Merhaba, cevabınız hakkında daha fazla bilgi ekleyebilir misiniz, sadece kod sağlamanıza yardımcı olmaz.
Nicolas

Merhaba @Nicolas Ben koda satır satır açıklama ekledim. Hala net değilse bana bildirin
Fouad Boukredine

Çünkü forEach atlama boş değerlere , sana eğer kurtulmak ve sadece yapabileceğini düşünüyorum Object.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));Frank Roth'un cevap gibi.
Darkproduct

12

For ... in döngüsü, bir for döngüsü gibi olduğu için bir nesnedeki her özelliği temsil eder. For ... in loop içindeki propt komutunu aşağıdakileri yaparak tanımladınız:

    for(var propt in obj){
alert(propt + ': ' + obj[propt]);
}

For ... in loop, bir nesnenin numaralandırılabilir özellikleri boyunca yinelenir. Hangi değişkeni tanımlarsanız veya for ... in döngüsüne koyarsanız koyun, yinelediği bir sonraki özelliğe her gittiğinde değişir. For ... in döngüsünde değişken, anahtarlar arasında yinelenir, ancak değeri anahtarın değeridir. Örneğin:

    for(var propt in obj) {
      console.log(propt);//logs name
      console.log(obj[propt]);//logs "Simon"
    }

Değişkenin, değişkenin değerinden nasıl farklı olduğunu görebilirsiniz. Buna karşılık, for ... döngüsü bunun tersini yapar.

Umarım bu yardımcı olur.


11
let obj = {"a": 3, "b": 2, "6": "a"}

Object.keys(obj).map((item) => {console.log("item", obj[item])})

// a
// 3
// 2

1
Diğer yorumlarda belirtildiği forEachgibi map, her yinelemede kod bloğunu çağırmanın sonuçları ile yeni bir dizi döndürmek amaçlandığı gibi , burada daha uygundur . Ancak, yalnızca her yinelemenin yan etkileriyle ilgileniyoruz, dönüş değeriyle değil, bu yüzden mapbize veren yeni diziye ihtiyacımız yok .
Danny

11
Object.keys(obj).forEach(key =>
  console.log(`key=${key} value=${obj[key]}`)
);

10

Lodash'ı kullanabilirsiniz. Dökümantasyon

var obj = {a: 1, b: 2, c: 3};
_.keys(obj).forEach(function (key) {
    ...
});

10
Neden bu "cevap" ın 10 upvotes var? Soruyu tamamen cevaplayamıyor. Ortalama JS geliştiricisinin istihbaratına olan inancını kaybetmeye başlıyorum.
developerbmw

1
@developerbmw ES6 özelliklerini kullanmanın daha doğru bir yol olduğunu anlıyorum, ancak bir yıl önce cevap verdim. Lütfen bir dakikanız olduğunda düşüncelerinizi bizimle paylaşın.
viktarpunko

1
Buradaki fikir, kullanıcının sayfasına 10000 satır kitaplığı eklemesini önermek yerine yerel yöntemlere daha fazla odaklanmaktır. Beni yanlış anlamayın, Lodash'ı kullanmayı seviyorum ama bunun için bir zaman ve bir yer var ve bu değil.

9

Sizin fordöngü nesnesinin tüm özelliklerini üzerinde yineleme edilir obj. proptfor döngünüzün ilk satırında tanımlanır. objNesnenin bir özelliğinin adı olan bir dizedir . Döngünün ilk yinelemesinde propt"ad" olur.


9

JavaScript'teki nesneler özellik koleksiyonlarıdır ve bu nedenle her deyim için bir imlecinde döngüye sokulabilir.

objBir anahtar değer koleksiyonu olarak düşünmelisiniz .


! bu 'özellik listelerinin' anahtar olarak adlara sahip olması önemli farkla birlikte, normal JS dizilerinin yalnızca anahtar olarak sayıları olabilir.
Qqwy

9

Günümüzde standart bir JS nesnesini yalnızca bir Symbol.iterator yöntemi ekleyerek yinelenebilir bir nesneye dönüştürebilirsiniz. Daha sonra bir for ofdöngü kullanabilir ve değerlerine doğrudan erişebilir veya hatta nesne üzerinde bir yayma işleci de kullanabilirsiniz. Güzel. Nasıl başarabileceğimizi görelim:

var o = {a:1,b:2,c:3},
    a = [];
o[Symbol.iterator] = function*(){
                       var ok = Object.keys(this);
                            i = 0;
                       while (i < ok.length) yield this[ok[i++]];
                     };
for (var value of o) console.log(value);
// or you can even do like
a = [...o];
console.log(a);


1
Bunu yapmanın ilginç bir yolu. function*Keşif için teşekkürler !
Benj

5

Düğüm çalıştırıyorsanız tavsiye ederim:

Object.keys(obj).forEach((key, index) => {
    console.log(key);
});

5

En yüksek puanlı yanıt doğru olsa da, alternatif bir kullanım örneğidir; örneğin, bir nesnenin üzerinde yineleme yapıyorsanız ve sonunda bir dizi oluşturmak istiyorsanız. Yerine .mapkullanınforEach

const newObj = Object.keys(obj).map(el => {
    //ell will hold keys 
   // Getting the value of the keys should be as simple as obj[el]
})

4

Ayrıca özyinelemeli yol ekleyerek:

function iterate(obj) {
    // watch for objects we've already iterated so we won't end in endless cycle
    // for cases like var foo = {}; foo.bar = foo; iterate(foo);
    var walked = [];
    var stack = [{obj: obj, stack: ''}];
    while(stack.length > 0)
    {
        var item = stack.pop();
        var obj = item.obj;
        for (var property in obj) {
            if (obj.hasOwnProperty(property)) {
                if (typeof obj[property] == "object") {
                  // check if we haven't iterated through the reference yet
                  var alreadyFound = false;
                  for(var i = 0; i < walked.length; i++)
                  {
                    if (walked[i] === obj[property])
                    {
                      alreadyFound = true;
                      break;
                    }
                  }
                  // new object reference
                  if (!alreadyFound)
                  {
                    walked.push(obj[property]);
                    stack.push({obj: obj[property], stack: item.stack + '.' + property});
                  }
                }
                else
                {
                    console.log(item.stack + '.' + property + "=" + obj[property]);
                }
            }
        }
    }
}

Kullanımı:

iterate({ foo: "foo", bar: { foo: "foo"} }); 

1
@faiz - yorumlarımı görün, tekrar tekrar döngüsel referansları olan yalak nesne yürürken sonsuz döngüde sıkışmaya karşı koruma
Ondrej Svejdar

3

..İn döngüsünün yaptığı, yeni bir değişken (var someVariable) oluşturması ve daha sonra verilen nesnenin her özelliğini bu yeni değişken (someVariable) içinde tek tek depolamasıdır. Bu nedenle {} bloğunu kullanırsanız, yineleyebilirsiniz. Aşağıdaki örneği ele alalım.

var obj = {
     name:'raman',
     hobby:'coding',
     planet:'earth'
     };

for(var someVariable in obj) {
  //do nothing..
}

console.log(someVariable); // outputs planet

Basitlik göz önüne alındığında, bunu destekliyoruz. Benim kullanım durumumda tehlikeli nesneler-NaNs, nulls, undefined için bir nesnede tüm öznitelikleri kontrol etmek gerekir (bir grafik üzerinde noktaları vardı ve bu değerler grafiğin çizimini engelledi). Ad yerine değeri almak için, döngüde yapmanız yeterlidir obj[someVariable]. Belki de bu kadar çok reddedilmesinin nedeni, yinelemeli olmamasıdır. Bu nedenle, yüksek derecede yapılandırılmış bir nesneniz varsa, bu yeterli bir çözüm olmaz.
Katharine Osborne

@KatharineOsborne ya da belki de aşağıdaki cümle biraz şifreli olduğu için: "Bu nedenle {} bloğunu kullanırsanız, yineleyebilirsiniz." Kod metinden daha fazlasını söylüyor.
bvdb

3

Burada her düğümü yineliyorum ve anlamlı düğüm adları oluşturuyorum. Eğer fark ederseniz, exampleOf Array ve instanceOf Object hemen hemen aynı şeyi yapar (uygulamamda olsa da farklı mantık veriyorum)

function iterate(obj,parent_node) {
    parent_node = parent_node || '';
    for (var property in obj) {
        if (obj.hasOwnProperty(property)) {
            var node = parent_node + "/" + property;
            if(obj[property] instanceof Array) {
                //console.log('array: ' + node + ":" + obj[property]);
                iterate(obj[property],node)
            } else if(obj[property] instanceof Object){
                //console.log('Object: ' + node + ":" + obj[property]);
                iterate(obj[property],node)
            }
            else {
                console.log(node + ":" + obj[property]);
            }
        }
    }
}

not - Ondrej Svejdar'ın cevabından ilham aldım. Ancak bu çözüm daha iyi performansa ve daha az belirsiz


3

Temel olarak nesnedeki her özellik arasında döngü yapmak istersiniz.

JSFiddle

var Dictionary = {
  If: {
    you: {
      can: '',
      make: ''
    },
    sense: ''
  },
  of: {
    the: {
      sentence: {
        it: '',
        worked: ''
      }
    }
  }
};

function Iterate(obj) {
  for (prop in obj) {
    if (obj.hasOwnProperty(prop) && isNaN(prop)) {
      console.log(prop + ': ' + obj[prop]);
      Iterate(obj[prop]);
    }
  }
}
Iterate(Dictionary);

obj(prop)TypeError: obj bir işlev değil
le_m

@ le_m benim hatam. Yanlışlıkla bu hasOwnPropertyözelliği kaldırmalıyım . Şimdi çalışmalı.
HovyTech

2

Yukarıdaki yanıtlara eklemek istiyorum, çünkü Javascript'ten farklı niyetleriniz olabilir. Bir JSON nesnesi ve bir Javascript nesnesi farklı şeylerdir ve yukarıda önerilen çözümleri kullanarak bir JSON nesnesinin özellikleri arasında yineleme yapmak ve sonra şaşırmak isteyebilirsiniz.

Bir JSON nesneniz olduğunu varsayalım:

var example = {
    "prop1": "value1",
    "prop2": [ "value2_0", value2_1"],
    "prop3": {
         "prop3_1": "value3_1"
    }
}

'Özelliklerini' yinelemenin yanlış yolu:

function recursivelyIterateProperties(jsonObject) {
    for (var prop in Object.keys(example)) {
        console.log(prop);
        recursivelyIterateProperties(jsonObject[prop]);
    }
}

Sen konsol günlüğünü görme sürpriz olabilir 0, 1vb zaman iterating özellikleri sayesinde prop1ve prop2veprop3_1 . Bu nesneler dizilerdir ve bir dizinin dizinleri Javascript'teki o nesnenin özellikleridir.

Bir JSON nesnesi özellikleri arasında özyinelemeli olarak yineleme yapmanın daha iyi bir yolu , öncelikle bu nesnenin bir dizi olup olmadığını kontrol etmektir:

function recursivelyIterateProperties(jsonObject) {
    for (var prop in Object.keys(example)) {
        console.log(prop);
        if (!(typeof(jsonObject[prop]) === 'string')
            && !(jsonObject[prop] instanceof Array)) {
                recursivelyIterateProperties(jsonObject[prop]);

            }

     }
}

1

Ayrıca rafine etmek kabul cevap Eğer bir nesneyi örneğini eğer belirterek 's değerinde var object = Object.create(null)sonra object.hasOwnProperty(property)bir TypeError tetikleyecektir. Bu yüzden güvenli tarafta olmak için, bunu prototipten şöyle çağırmanız gerekir:

for (var property in object) {
    if (Object.prototype.hasOwnProperty.call(object, property)) {
        // do stuff
    }
}

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.