it-swarm-tr.com

Bir JavaScript nesnesinin özelliklerini nasıl numaralandırırım?

Bir JavaScript nesnesinin özelliklerini nasıl numaralandırırım?

Aslında tüm tanımlanmış değişkenleri ve değerlerini listelemek istiyorum, ama bir değişkeni tanımlamanın aslında pencere nesnesinin bir özelliğini yarattığını öğrendim.

626
davenpcj

Yeterince basit:

for(var propertyName in myObject) {
   // propertyName is what you want
   // you can get the value like this: myObject[propertyName]
}

Şimdi, bu şekilde özel değişkenleri alamayacaksınız çünkü mevcut değiller.


EDIT: @bitwiseplatypus , hasOwnProperty() yöntemini kullanmadığınız sürece miras alınan özellikleri alacağınız doğrudur - ancak, nesne yönelimli programlamaya aşina bir kimsenin neden daha azını beklediğini bilmiyorum! Tipik olarak, bunu ortaya çıkaran biri, Douglas Crockford'un bu konuda uyardığı ve beni hala biraz şaşırttı. Yine miras, OO dilinin normal bir parçasıdır ve bu nedenle prototip olmasına rağmen JavaScript'in bir parçasıdır.

Şimdi, dedi ki, hasOwnProperty() is filtreleme için faydalıdır, ancak kalıtsal özelliklerin elde edilmesinde tehlikeli bir şey varmış gibi bir uyarı vermemize gerek yoktur.

EDIT 2: @bitwiseplatypus / birisi, nesnelerinize orijinal olarak yazdığınızdan (bir prototip aracılığıyla) yazdığınızdan sonraki bir zamanda nesnelerinize özellikler/yöntemler eklemesi durumunda ortaya çıkacak durumu ortaya çıkarır - beklenmeyen davranışlara neden olabilir, şahsen bunu tamamen sorunum olarak görmüyorum. Sadece bir fikir meselesi. Ayrıca, şeyleri nesnelerimin yapımı sırasında prototip kullanacak ve yine de nesnenin özellikleri üzerinde yinelenen ve tüm miras kalan özellikleri istemek için bir kod kullanacak şekilde tasarlarsam ne olur? hasOwnProperty() işlevini kullanmam. O zaman diyelim ki, birisi daha sonra yeni özellikler ekler. Bu noktada işler kötü davranıyorsa bu benim suçum mu? Sanmıyorum Bence bu nedenle jQuery, nasıl çalıştığını genişletme yollarını belirledi (jQuery.extend ve jQuery.fn.extend aracılığıyla).

783
Jason Bunting

Bir nesnenin özelliklerini numaralandırmak için bir for..in döngüsü kullanın, ancak dikkatli olun. Numaralandırma, yalnızca numaralandırılan nesnenin değil, aynı zamanda herhangi bir ana nesnenin prototipinin özelliklerini de döndürür.

var myObject = {foo: 'bar'};

for (var name in myObject) {
  alert(name);
}

// results in a single alert of 'foo'

Object.prototype.baz = 'quux';

for (var name in myObject) {
  alert(name);
}

// results in two alerts, one for 'foo' and one for 'baz'

Numaralandırmanıza devralınmış özellikleri dahil etmekten kaçınmak için hasOwnProperty() işlevini kontrol edin:

for (var name in myObject) {
  if (myObject.hasOwnProperty(name)) {
    alert(name);
  }
}

Düzenleme: JasonBunting'in devralınan mülkleri numaralandırma konusunda endişelenmemize gerek olmadığı konusundaki ifadesine katılmıyorum. Bu kodun davranışını değiştirebileceği için, is miras almadığınız malların üzerinde numaralandırma tehlikesi vardır.

Bu sorunun diğer dillerde olup olmadığı önemli değil; gerçek şu ki var ve JavaScript özellikle savunmasız, çünkü bir nesnenin prototipinde yapılan değişiklikler, değişiklik başlatıldıktan sonra yapılsa bile alt nesneleri etkiliyor.

Bu yüzden JavaScript hasOwnProperty() işlevini sunar ve bu nedenle üçüncü taraf kodunun (veya bir prototipi değiştirebilecek başka bir kodun) sizinkileri kırmamasını sağlamak için kullanmanız gerekir. Fazladan birkaç baytlık kod eklemenin yanı sıra, hasOwnProperty() işlevini kullanmanın bir dezavantajı yoktur.

215
Ryan Grove

Zaten birkaç kez teklif edilen standart yol:

for (var name in myObject) {
  alert(name);
}

Bununla birlikte, Internet Explorer 6, 7 ve 8'in JavaScript yorumlayıcısında bir hata vardır; bu, bazı anahtarların numaralandırılmadığı anlamına gelir. Bu kodu çalıştırırsanız:

var obj = { toString: 12};
for (var name in obj) {
  alert(name);
}

IE dışındaki tüm tarayıcılarda "12" uyarısı verilirse. IE bu anahtarı görmezden gelir. Etkilenen anahtar değerleri:

  • isPrototypeOfname__
  • hasOwnPropertyname__
  • toLocaleStringname__
  • toStringname__
  • valueOfname__

IE konusunda gerçekten güvende olmak için, şöyle bir şey kullanmalısınız:

for (var key in myObject) {
  alert(key);
}

var shadowedKeys = [
  "isPrototypeOf",
  "hasOwnProperty",
  "toLocaleString",
  "toString",
  "valueOf"
];
for (var i=0, a=shadowedKeys, l=a.length; i<l; i++) {
  if map.hasOwnProperty(a[i])) {
    alert(a[i]);
  }
}

İyi haber şu ki, EcmaScript 5, bir nesnenin anahtarlarını bir dizi olarak döndüren Object.keys(myObject) işlevini ve bazı tarayıcıları (ör. Safari 4) zaten uyguladı.

50
Fabian Jakobs

Modern tarayıcılarda (ECMAScript 5) tüm numaralandırılabilir özellikleri elde etmek için yapabilecekleriniz:

Object.keys (obj) (Eski tarayıcılarda geriye dönük uyumluluk için bir snippet almak için bağlantıyı kontrol edin)

Veya numaralandırılamayan özellikleri de elde etmek için:

Object.getOwnPropertyNames (obj)

ECMAScript 5 uyumluluk tablosunu kontrol edin

Ek bilgi: Numaralandırılabilir özellik nedir?

44
Carlos Ruana

Beni şaşırtan bir dava örneğinin alakalı olduğunu düşünüyorum:

var myObject = { name: "Cody", status: "Surprised" };
for (var propertyName in myObject) {
  document.writeln( propertyName + " : " + myObject[propertyName] );
}

Ama benim için sürpriz, çıktı

name : Cody
status : Surprised
forEach : function (obj, callback) {
    for (prop in obj) {
        if (obj.hasOwnProperty(prop) && typeof obj[prop] !== "function") {
            callback(prop);
        }
    }
}

Niye ya? Sayfadaki başka bir komut dosyası Nesne prototipini genişletti:

Object.prototype.forEach = function (obj, callback) {
  for ( prop in obj ) {
    if ( obj.hasOwnProperty( prop ) && typeof obj[prop] !== "function" ) {
      callback( prop );
    }
  }
};
24
cyberhobo
for (prop in obj) {
    alert(prop + ' = ' + obj[prop]);
}
16
Andrew Hedges

Basit JavaScript kodu:

for(var propertyName in myObject) {
   // propertyName is what you want.
   // You can get the value like this: myObject[propertyName]
}

jQuery:

jQuery.each(obj, function(key, value) {
   // key is what you want.
   // The value is in: value
});
10
EmRa228

Buldum ... for (property in object) { // do stuff } tüm özellikleri listeleyecek ve bu nedenle pencere nesnesinde global olarak bildirilen tüm değişkenleri listeleyecektir.

9
davenpcj

Bir nesnenin özelliklerini nasıl sıralayacağınız:

var params = { name: 'myname', age: 'myage' }

for (var key in params) {
  alert(key + "=" + params[key]);
}
8
Chtiwi Malek

Eğer Underscore.js library kullanıyorsanız, keys fonksiyonunu kullanabilirsiniz.

_.keys({one : 1, two : 2, three : 3});
=> ["one", "two", "three"]
7
dkl

Python'un diktisinde 'anahtar' yöntemi vardır ve bu gerçekten faydalıdır. Bence JavaScript’te buna sahip olabiliriz:

function keys(){
    var k = [];
    for(var p in this) {
        if(this.hasOwnProperty(p))
            k.Push(p);
    }
    return k;
}
Object.defineProperty(Object.prototype, "keys", { value : keys, enumerable:false });

EDIT: Ama @ carlos-ruana'nın yanıtı çok iyi çalışıyor. Object.keys (window) programını test ettim ve sonuç beklediğim gibi oldu.

5 yıl sonra EDIT: Object öğesini uzatmak iyi bir fikir değildir, çünkü nesnelerinde keys kullanmak isteyebilecek diğer kütüphanelerle çakışabilir ve projeniz üzerinde öngörülemeyen davranışlara yol açabilir. @ carlos-ruana cevabı bir nesnenin anahtarlarını almak için doğru yoldur.

5

for döngüsünü kullanabilirsiniz.

Bir dizi kullanmak istiyorsanız:

Object.keys(object1)

Ref. Object.keys ()

4
Walle Cyril

Nesneye karşı yeni kod yazmak için özellikleri sıralamaya çalışıyorsanız, bunları görsel olarak görmek için Firebug gibi bir hata ayıklayıcı kullanmanızı öneririm.

Başka bir kullanışlı teknik, nesneyi JSON'a serileştirmek için Prototip'in Object.toJSON () yöntemini kullanmaktır, bu da hem özellik adlarını hem de değerleri gösterir.

var data = {name: 'Violet', occupation: 'character', age: 25, pets: ['frog', 'rabbit']};
Object.toJSON(data);
//-> '{"name": "Violet", "occupation": "character", "age": 25, "pets": ["frog","rabbit"]}'

http://www.prototypejs.org/api/object/tojson

2
Chase Seibert

Ben hala JavaScript'te acemiyim ama tekrar tekrar bir nesnenin ve tüm özelliklerini yazdıran küçük bir fonksiyon yazdım:

getDescription(object, tabs) {
  var str = "{\n";
  for (var x in object) {
      str += Array(tabs + 2).join("\t") + x + ": ";
      if (typeof object[x] === 'object' && object[x]) {
        str += this.getDescription(object[x], tabs + 1);
      } else {
        str += object[x];
      }
      str += "\n";
  }
  str += Array(tabs + 1).join("\t") + "}";
  return str;
}
0
Felix Lapalme