126

次のような JavaScript オブジェクトがあるとします。

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

プロパティ名でプロパティにアクセスできます。

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

しかし、プロパティの名前がわからない場合、これらの値を取得することは可能ですか? これらのプロパティの順序付けられていない性質により、それらを区別することは不可能ですか?

私の場合、関数が一連の名前と値のペアを受け入れる必要がある状況を具体的に考えていますが、プロパティの名前は変更される可能性があります。

これまでのところ、これを行う方法についての私の考えは、プロパティの名前をデータとともに関数に渡すことですが、これはハックのように感じます。可能であれば、これをイントロスペクションで行うことをお勧めします。

4

8 に答える 8

145

次のようにキーをループできます。

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

これにより、「名前」と「値」が記録されます。

より複雑なオブジェクト タイプ (元の質問のように単純なハッシュのようなオブジェクトだけではない) がある場合は、オブジェクトのプロトタイプのキーではなく、オブジェクト自体に属するキーのみをループする必要があります。

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

ご指摘のとおり、キーは特定の順序であるとは限りません。これが次のものとどのように異なるかに注意してください。

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

この例では、値をループ処理するため、 と が記録Property Nameされます0。注意: このfor each構文はほとんど Firefox でのみサポートされており、他のブラウザーではサポートされていません。

ターゲット ブラウザーが ES5 をサポートしている場合、またはサイトに ES5 が含まれている場合es5-shim.js(推奨)、以下も使用できますObject.keys

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

そしてループArray.prototype.forEach

Object.keys(data).forEach(function (key) {
  console.log(data[key]);
});
// => Logs "Property Name", 0
于 2009-03-23T21:09:19.310 に答える
68

古いバージョンのJavaScript(<ES5)では、for..inループを使用する必要があります。

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

ES5ではObject.keysArray#forEachが導入されており、これによりこれが少し簡単になります。

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はとを紹介Object.valuesObject.entriesます。

Object.values(data) // ['bar', 'quux']
Object.entries(data) // [['foo', 'bar'], ['baz', 'quux']]
于 2012-04-20T02:51:28.637 に答える
10
for(var property in data) {
    alert(property);
}
于 2009-03-23T21:09:15.410 に答える
4

オブジェクトのインスタンスの特定のプロパティを調べたい場合がよくありますが、共有されているすべてのプロトタイプ メソッドとプロパティは必要ありません。

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

    return A.join(', ');
}
于 2009-03-24T01:26:52.980 に答える
1

Object.keys()を使用できます。「これは、通常のループで得られるのと同じ順序で、指定されたオブジェクト自体の列挙可能なプロパティ名の配列を返します。」

の代わりに任意のオブジェクトを使用できます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]);
}

于 2013-03-12T20:49:09.617 に答える
-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
于 2013-04-15T15:09:29.747 に答える