이름을 모르는 경우 JavaScript 객체의 속성에 액세스하려면 어떻게해야합니까?
-
21-08-2019 - |
문제
다음과 같은 JavaScript 객체가 있다고 가정합니다.
var data = { foo: 'bar', baz: 'quux' };
속성 이름으로 속성에 액세스 할 수 있습니다.
var foo = data.foo;
var baz = data["baz"];
그러나 속성의 이름을 모르는 경우 이러한 값을 얻을 수 있습니까? 이 속성의 정렬되지 않은 특성이 그들에게 구별되는 것을 불가능하게 만드는가?
제 경우에는 기능이 일련의 이름 값 쌍을 수락해야하지만 속성의 이름이 변경 될 수있는 상황에 대해 구체적으로 생각하고 있습니다.
지금 까지이 작업을 수행하는 방법에 대한 나의 생각은 속성의 이름을 데이터와 함께 함수에 전달하는 것이지만 이것은 해킹처럼 느껴집니다. 가능하면 내성으로 이것을하는 것을 선호합니다.
해결책 2
이전 버전의 JavaScript (<es5)는 for..in
고리:
for (var key in data) {
if (data.hasOwnProperty(key)) {
// do something with key
}
}
ES5가 소개됩니다 객체 .keys 그리고 배열#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']]
다른 팁
다음과 같은 키를 반복 할 수 있습니다.
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
. NB : 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
for(var property in data) {
alert(property);
}
당신은 종종 그것을 조사하고 싶을 것입니다 특정한 공유 프로토 타입 방법 및 속성이없는 객체 인스턴스의 특성 :
Obj.prototype.toString= function(){
var A= [];
for(var p in this){
if(this.hasOwnProperty(p)){
A[A.length]= p+'='+this[p];
}
}
return A.join(', ');
}
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]);
}
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
}
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 */
}
});
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