web-dev-qa-db-ja.com

名前がわからない場合、javascriptオブジェクトのプロパティにアクセスするにはどうすればよいですか?

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

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

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

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

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

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

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

118
Adam Lassek

古いバージョンの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.values および Object.entries .

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

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

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-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
138
Ron DeVera
for(var property in data) {
    alert(property);
}
10
karim79

多くの場合、オブジェクトのインスタンスの特定プロパティを、すべての共有プロトタイプメソッドとプロパティなしで調べる必要があります。

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

    return A.join(', ');
}
4
kennebec
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;
}

これにより、すべてのプロパティとその値(継承または所有、列挙可能またはそうでない)が新しいオブジェクトに取得されます。元のオブジェクトは変更されません。これで、新しいオブジェクトを使用してトラバースできます

var obj = { 'b': '4' }; //example object
var detailedObject = getDetailedObject(obj);
for(var o in detailedObject) {
    console.log('key: ' + o + '   value: ' + detailedObject[o]);
}
3
Shishir Arora
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
}
1
Mayank_VK
var fs   = require("fs");

fs.stat( process.argv[1], function( err, stats ){
if (err) {
     console.log( err.message ); 
     return;    
} else {
 console.log(JSON.stringify(stats));

/*  this is the answer here  */

    for (var key in Object.keys(stats)){
    var t = Object.keys( stats )[key];
    console.log( t + " value =: " + stats[t]  );
     }  

/*  to here, run in node */
   }
});
0
Cloid J. Green