İsimleri bilmiyorsam bir javascript nesnesinin özelliklerine nasıl erişebilirim?


124

Bunun gibi bir javascript nesneniz olduğunu varsayalım:

var data = { foo: 'bar', baz: 'quux' };

Mülklere mülk adına göre erişebilirsiniz:

var foo = data.foo;
var baz = data["baz"];

Ancak mülklerin adını bilmiyorsanız bu değerleri almanız mümkün müdür? Bu özelliklerin sırasız doğası, onları birbirinden ayırmayı imkansız kılıyor mu?

Benim durumumda, özellikle bir işlevin bir dizi ad-değer çiftini kabul etmesi gereken, ancak özelliklerin adlarının değişebileceği bir durumu düşünüyorum.

Şimdiye kadar bunun nasıl yapılacağına dair düşüncelerim, özelliklerin isimlerini verilerle birlikte fonksiyona iletmek, ancak bu bir hack gibi geliyor. Mümkünse bunu iç gözlemle yapmayı tercih ederim.

Yanıtlar:


144

Anahtarlar arasında şu şekilde geçiş yapabilirsiniz:

for (var key in data) {
  console.log(key);
}

Bu, "Ad" ve "Değer" i günlüğe kaydeder.

Daha karmaşık bir nesne türünüz varsa (orijinal soruda olduğu gibi yalnızca hash benzeri bir nesne değil), nesnenin prototipindeki anahtarların aksine, yalnızca nesnenin kendisine ait anahtarlar arasında döngü yapmak isteyeceksiniz :

for (var key in data) {
  if (data.hasOwnProperty(key)) {
    console.log(key);
  }
}

Sizin de belirttiğiniz gibi, anahtarların belirli bir sırada olması garanti edilmez. Bunun aşağıdakilerden ne kadar farklı olduğuna dikkat edin:

for each (var value in data) {
  console.log(value);
}

Bu örnek değerler arasında döngü yapar, bu nedenle log Property Nameve 0. Not: for eachSözdizimi çoğunlukla yalnızca Firefox'ta desteklenir, ancak diğer tarayıcılarda desteklenmez.

Hedef tarayıcılarınız ES5'i destekliyorsa veya siteniz içeriyorsa es5-shim.js(önerilen), şunları da kullanabilirsiniz Object.keys:

var data = { Name: 'Property Name', Value: '0' };
console.log(Object.keys(data)); // => ["Name", "Value"]

ve şununla döngü yapın Array.prototype.forEach:

Object.keys(data).forEach(function (key) {
  console.log(data[key]);
});
// => Logs "Property Name", 0

Sonuncusunu sen mi uydurdun ve gerçekten paçayı sıyırdın mı? Aferin ... =)
nickl-

Bu Firefox'ta ( docs ) var, ancak evrensel olmadığı konusunda doğru bir nokta. Bundan bahsetmek için cevabı güncelleyeceğim.
Ron DeVera

28
btw alarmı, bir şeylerde hata ayıklamanın kötü bir yoludur, console.log'u deneyin
StackOverflowed

Soru sorulduğunda en iyi cevap buydu, ancak sonraki JS sürümleri daha iyi araçlar sağladığından onay işaretini kaldırıyorum.
Adam Lassek

65

JavaScript'in (<ES5) eski sürümleri bir for..indöngü kullanılmasını gerektirir :

for (var key in data) {
  if (data.hasOwnProperty(key)) {
    // do something with key
  }
}

ES5, Object.keys ve Array # forEach'i sunar ve bu da bunu biraz daha kolaylaştırır:

var data = { foo: 'bar', baz: 'quux' };

Object.keys(data); // ['foo', 'baz']
Object.keys(data).map(function(key){ return data[key] }) // ['bar', 'quux']
Object.keys(data).forEach(function (key) {
  // do something with data[key]
});

ES2017 tanıtır Object.valuesve Object.entries.

Object.values(data) // ['bar', 'quux']
Object.entries(data) // [['foo', 'bar'], ['baz', 'quux']]

1
Şimdi bu aslında soruyu yanıtlıyor, aferin @Adam Lassek, çok güzel.
nickl-

Nesne anahtarları olarak hem 'ad' hem de 'değer'i kullanmak yanıltıcıdır. Bu işlev, değerleri değil, yalnızca bir listedeki anahtarları döndürür. {ad1: 'değer1', ad2: 'değer2'} yeni başlayanlar için kafa karışıklığını önleyecektir. Object.keys (veri); // ['ad1', 'ad2']
James Nicholson

2
@JamesNicholson Kabul ediyorum, daha az kafa karıştırıcı olacak şekilde düzenlendi.
Adam Lassek


4

Sıklıkla, paylaşılan prototip yöntemlerinin ve özelliklerinin tümü olmadan, bir nesnenin bir örneğinin belirli özelliklerini incelemek isteyeceksiniz :

 Obj.prototype.toString= function(){
        var A= [];
        for(var p in this){
            if(this.hasOwnProperty(p)){
                A[A.length]= p+'='+this[p];
            }
        }

    return A.join(', ');
}

3
function getDetailedObject(inputObject) {
    var detailedObject = {}, properties;

    do {
        properties = Object.getOwnPropertyNames( inputObject );
        for (var o in properties) {
            detailedObject[properties[o]] = inputObject[properties[o]];
        }
    } while ( inputObject = Object.getPrototypeOf( inputObject ) );

    return detailedObject;
}

Bu, yeni bir nesnede tüm özellikleri ve değerlerini (miras alınan veya sahip olunan, numaralandırılabilir veya edilemeyen) alacaktır. orijinal nesneye dokunulmamış. Şimdi yeni nesne kullanılarak geçilebilir

var obj = { 'b': '4' }; //example object
var detailedObject = getDetailedObject(obj);
for(var o in detailedObject) {
    console.log('key: ' + o + '   value: ' + detailedObject[o]);
}

1
var obj = {
 a: [1, 3, 4],
 b: 2,
 c: ['hi', 'there']
 }
for(let r in obj){  //for in loop iterates all properties in an object
 console.log(r) ;  //print all properties in sequence
 console.log(obj[r]);//print all properties values
}

Bu yanıt, OP tarafından neyin gerekli olduğunu, ancak ne yaptığınız ve OP'nin bunu neden kullanması gerektiğinin küçük bir tanımını sağladığında, .hasOwnProperty()bir nesneyi yinelemek için for in kullandığınızda da unutmayın .
Muhammed Ömer Aslam

Teşekkürler, kabul ediyorum .hasOwnProperty () nesneyi yineledi, ancak bir koşulu kontrol etmek için yineledi, ancak onu kullanarak bir nesnenin tüm özelliklerini yazdıramayız. Yanılıyorsam düzeltin.
Mayank_VK

hasOwnProperty()Yöntem, döner bir booleanamacı, belirli bir özelliği olup olmadığını belirten (o miras aksine) kendi özelliği olarak . bu örneğe
Muhammed Ömer Aslam

1

"Belirli bir nesnenin kendi numaralandırılabilir özellik adlarından oluşan bir diziyi normal bir döngüde elde ettiğimiz sırayla döndüren Object.keys () 'i kullanabilirsiniz ."

Bunun yerine herhangi bir nesneyi kullanabilirsiniz stats:

var stats = {
  a: 3,
  b: 6,
  d: 7,
  erijgolekngo: 35
}
/*  this is the answer here  */
for (var key in Object.keys(stats)) {
  var t = Object.keys(stats)[key];
  console.log(t + " value =: " + stats[t]);
}


Daha fazla açıklama ekleyebilir misiniz?
Keith Pinson 13

Object.keys( stats )[key]hiçbir anlam ifade etmiyor, her zaman olacak undefined.
Adam Lassek

-2
var attr, object_information='';

for(attr in object){

      //Get names and values of propertys with style (name : value)
      object_information += attr + ' : ' + object[attr] + '\n'; 

   }


alert(object_information); //Show all Object

Bu, kabul edilen cevaba hiçbir şey eklemez ve bilgiyi mümkün olan en az yararlı şekilde sunar. Ve devralınan mülkleri hesaba katmaz.
Adam Lassek
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.