Javascript 객체가있는 경우 :
var objects={...};
속성 이름 ( ‘키’를 알지 못함)을 모르고 루프에서 각 속성 값을 얻는 방법을 모르는 50 개 이상의 속성이 있다고 가정하십시오.
답변
간단한 for..in
루프 를 사용하여 :
for(var key in objects) {
var value = objects[key];
}
답변
지원해야하는 브라우저에 따라 여러 가지 방법으로 수행 할 수 있습니다. 야생에서 압도적 인 대다수의 브라우저는 ECMAScript 5 (ES5)를 지원하지만 아래의 많은 예가 사용됩니다Object.keys
것이 IE <9에서는 사용할 수 없다는 됩니다 . 호환성 표를 참조하십시오 .
ECMAScript 3 이상
이전 버전의 IE를 지원해야하는 경우이 옵션이 적합합니다.
for (var key in obj) {
if (Object.prototype.hasOwnProperty.call(obj, key)) {
var val = obj[key];
// use val
}
}
중첩 if
은 객체의 프로토 타입 체인 (거의 확실하게 원하는 동작)의 속성을 열거하지 않도록합니다. 당신은 사용해야합니다
Object.prototype.hasOwnProperty.call(obj, key) // ok
오히려
obj.hasOwnProperty(key) // bad
ECMAScript 5+를 사용하면을 사용하여 프로토 타입이없는 객체를 만들 수 있으므로 Object.create(null)
이러한 객체에는hasOwnProperty
방법 . 못된 코드는 hasOwnProperty
메소드 를 대체하는 오브젝트를 생성 할 수도 있습니다 .
ECMAScript 5 이상
ECMAScript 5 이상을 지원하는 모든 브라우저에서 이러한 방법을 사용할 수 있습니다. 이것들은 객체로부터 값을 얻고 프로토 타입 체인을 열거하지 않습니다. obj
당신의 목표는 어디에 있습니까?
var keys = Object.keys(obj);
for (var i = 0; i < keys.length; i++) {
var val = obj[keys[i]];
// use val
}
좀 더 컴팩트 한 것을 원하거나 루프의 함수에주의를 기울이고 Array.prototype.forEach
싶다면 친구입니다.
Object.keys(obj).forEach(function (key) {
var val = obj[key];
// use val
});
다음 메소드는 객체의 값을 포함하는 배열을 만듭니다. 루핑 오버에 편리합니다.
var vals = Object.keys(obj).map(function (key) {
return obj[key];
});
// use vals array
Object.keys
안전하게 사용하는 사람들을 null
(있는 그대로 for-in
) 만들고 싶다면 할 수 있습니다 Object.keys(obj || {})...
.
Object.keys
열거 가능한 속성을 반환 합니다. 간단한 객체를 반복하려면 일반적으로 충분합니다. 열거 할 수없는 속성이있는 작업이 필요한 경우 Object.getOwnPropertyNames
대신 사용할 수 있습니다 .Object.keys
.
ECMAScript 2015 이상 (AKA ES6)
ECMAScript 2015를 사용하면 배열을 더 쉽게 반복 할 수 있습니다. 루프에서 하나씩 값을 사용하여 작업 할 때이 기능을 유리하게 사용할 수 있습니다.
for (const key of Object.keys(obj)) {
const val = obj[key];
// use val
}
ECMAScript 2015 fat-arrow 함수를 사용하여 객체를 값의 배열에 매핑하면 하나의 라이너가됩니다.
const vals = Object.keys(obj).map(key => obj[key]);
// use vals array
ECMAScript 2015에는 Symbol
속성 이름으로 사용될 수있는 인스턴스가 도입되었습니다 . 열거 할 객체의 심볼을 가져 오려면 사용하십시오 Object.getOwnPropertySymbols
(이 함수는 개인 속성을 만드는 데 사용할 Symbol
수없는 이유입니다 ). 새로운Reflect
ECMAScript 2015 API는를 제공 Reflect.ownKeys
합니다.이 속성은 열거 할 수없는 속성 이름 및 기호 목록을 반환합니다.
배열 이해 (사용하지 마십시오)
게시 전에 ECMAScript 6에서 어레이 이해가 제거되었습니다 . 제거하기 전에 솔루션은 다음과 같습니다.
const vals = [for (key of Object.keys(obj)) obj[key]];
// use vals array
ECMAScript 2017+
ECMAScript 2016에는이 주제에 영향을 미치지 않는 기능이 추가되었습니다. ECMAScript 2017 사양은 Object.values
및을 추가합니다 Object.entries
. 두 반환 배열 (와 유사점을 가진 일부에게는 놀랍습니다 Array.entries
). Object.values
그대로 또는 for-of
루프 와 함께 사용할 수 있습니다 .
const values = Object.values(obj);
// use values array or:
for (const val of Object.values(obj)) {
// use val
}
키와 값을 모두 사용하려면 원하는 Object.entries
것입니다. [key, value]
쌍으로 채워진 배열을 생성합니다 . for-of
루프 에서 그대로 또는 ECMAScript 2015 구조 지정 할당을 사용할 수 있습니다 .
for (const [key, val] of Object.entries(obj)) {
// use key and val
}
Object.values
틈 메우는 나무
마지막으로, 주석과 다른 답변에서 teh_senaus가 언급했듯이, 이들 중 하나를 심으로 사용하는 것이 좋습니다. 걱정하지 마십시오. 다음은 프로토 타입을 변경하지 않고 단지 방법을 추가합니다 Object
(훨씬 덜 위험합니다). 지방 화살표 기능을 사용하면 한 줄로도 수행 할 수 있습니다.
Object.values = obj => Object.keys(obj).map(key => obj[key]);
당신은 지금처럼 사용할 수 있습니다
// ['one', 'two', 'three']
var values = Object.values({ a: 'one', b: 'two', c: 'three' });
네이티브 Object.values
가 존재할 때 shimming을 피하려면 다음을 수행하십시오.
Object.values = Object.values || (obj => Object.keys(obj).map(key => obj[key]));
드디어…
지원해야하는 브라우저 / 버전에 유의하십시오. 위의 방법이나 언어 기능이 구현 된 곳이 맞습니다. 예를 들어 ECMAScript 2015에 대한 지원은 V8에서 기본적으로 꺼졌으며 최근에는 Chrome과 같은 브라우저가 사용되었습니다. 지원하려는 브라우저가 필요한 기능을 구현할 때까지 ECMAScript 2015의 기능을 사용하지 않아야합니다. 당신이 사용하는 경우 바벨 인 ECMAScript 5에 코드를 컴파일하려면, 당신은이 답변의 기능 모두에 액세스 할 수 있습니다.
답변
다음은 값을 배열로 가져 오기위한 재사용 가능한 함수입니다. 프로토 타입도 고려합니다.
Object.values = function (obj) {
var vals = [];
for( var key in obj ) {
if ( obj.hasOwnProperty(key) ) {
vals.push(obj[key]);
}
}
return vals;
}
답변
Underscore.js에 액세스 할 수 있으면 다음 _.values
과 같은 기능을 사용할 수 있습니다 .
_.values({one : 1, two : 2, three : 3}); // return [1, 2, 3]
답변
정말로 값 배열을 원한다면 for … in 루프로 배열을 만드는 것보다 더 깨끗합니다.
ECMA 5.1 이상
function values(o) { return Object.keys(o).map(function(k){return o[k]}) }
대부분의 경우 실제로 값 배열이 필요하지 않으므로이 작업을 수행하는 것이 더 빠릅니다.
for(var k in o) something(o[k]);
이것은 객체 o의 키를 반복합니다. 각 반복에서 k는 o의 키로 설정됩니다.
답변
ES5 Object.keys
var a = { a: 1, b: 2, c: 3 };
Object.keys(a).map(function(key){ return a[key] });
// result: [1,2,3]
답변
키를 반복 할 수 있습니다.
foo = {one:1, two:2, three:3};
for (key in foo){
console.log("foo["+ key +"]="+ foo[key]);
}
출력합니다 :
foo[one]=1
foo[two]=2
foo[three]=3