다음과 같은 javascript 객체가 있다고 가정합니다.
var data = { foo: 'bar', baz: 'quux' };
속성 이름으로 속성에 액세스 할 수 있습니다.
var foo = data.foo;
var baz = data["baz"];
그러나 속성의 이름을 모르는 경우 이러한 값을 얻을 수 있습니까? 이러한 속성의 순서가 지정되지 않은 특성으로 인해 구분이 불가능합니까?
제 경우에는 함수가 일련의 이름-값 쌍을 받아 들여야하지만 속성의 이름이 변경 될 수있는 상황을 구체적으로 생각하고 있습니다.
지금까지이 작업을 수행하는 방법에 대한 내 생각은 데이터와 함께 속성의 이름을 함수에 전달하는 것이지만 이것은 해킹처럼 느껴집니다. 가능하면 내성으로 이것을하는 것을 선호합니다.
답변
다음과 같이 키를 반복 할 수 있습니다.
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
답변
이전 버전의 JavaScript (<ES5)에는 for..in
루프를 사용해야 합니다.
for (var key in data) {
if (data.hasOwnProperty(key)) {
// do something with key
}
}
ES5는 Object.keys 및 Array # 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 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
}
답변
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]);
}