Javascript 객체가있는 경우 :
var objects={...};
속성 이름 ( '키'를 알지 못함)을 모르고 루프에서 각 속성 값을 얻는 방법을 모르는 50 개 이상의 속성이 있다고 가정하십시오.
Javascript 객체가있는 경우 :
var objects={...};
속성 이름 ( '키'를 알지 못함)을 모르고 루프에서 각 속성 값을 얻는 방법을 모르는 50 개 이상의 속성이 있다고 가정하십시오.
답변:
간단한 for..in
루프 를 사용하여 :
for(var key in objects) {
var value = objects[key];
}
enumerable
플래그가 false로 설정된 속성은 포함하지 않을 것 입니다. 이것은 무엇보다도 클래스 메소드를 반복하지 않지만 다른 방법으로 작성된 메소드를 반복한다는 것을 의미합니다.
지원해야하는 브라우저에 따라 여러 가지 방법으로 수행 할 수 있습니다. 야생에서 압도적 인 대다수의 브라우저는 ECMAScript 5 (ES5)를 지원하지만 아래의 많은 예가 사용됩니다Object.keys
것이 IE <9에서는 사용할 수 없다는 됩니다 . 호환성 표를 참조하십시오 .
이전 버전의 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 이상을 지원하는 모든 브라우저에서 이러한 방법을 사용할 수 있습니다. 이것들은 객체로부터 값을 얻고 프로토 타입 체인을 열거하지 않습니다. 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를 사용하면 배열을 더 쉽게 반복 할 수 있습니다. 루프에서 하나씩 값을 사용하여 작업 할 때이 기능을 유리하게 사용할 수 있습니다.
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 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에 코드를 컴파일하려면, 당신은이 답변의 기능 모두에 액세스 할 수 있습니다.
obj
두 번 언급해야합니다 . 도우미 기능을 만드는 것이 불가피하다고 생각합니까? values (obj)와 같은 것.
Object.values = obj => Object.keys(obj).map(key => obj[key]);
다음은 값을 배열로 가져 오기위한 재사용 가능한 함수입니다. 프로토 타입도 고려합니다.
Object.values = function (obj) {
var vals = [];
for( var key in obj ) {
if ( obj.hasOwnProperty(key) ) {
vals.push(obj[key]);
}
}
return vals;
}
Object
은 큰 문제가되지 않습니다 ( Object.keys
일반적인 shim). Object 프로토 타입을 수정하려고 생각하고있을 것입니다.
hasOwnProperty()
합니까? 해당 객체의 루프 내에서 키가 어떻게 반복됩니까?
Underscore.js에 액세스 할 수 있으면 다음 _.values
과 같은 기능을 사용할 수 있습니다 .
_.values({one : 1, two : 2, three : 3}); // return [1, 2, 3]
ES5 Object.keys
var a = { a: 1, b: 2, c: 3 };
Object.keys(a).map(function(key){ return a[key] });
// result: [1,2,3]
ECMA2017 이후 :
Object.values(obj)
모든 속성 값을 배열로 가져옵니다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values
이 질문은 상속 가능하고 열거 불가능한 속성을 원하는지 여부를 지정하지 않습니다.
이 또한 모든 것을 상속 된 속성과 비 열거 속성을 얻기위한 질문 구글이 쉽게 찾을 수는.
그에 대한 나의 해결책은 다음과 같습니다.
function getAllPropertyNames(obj) {
let result = new Set();
while (obj) {
Object.getOwnPropertyNames(obj).forEach(p => result.add(p));
obj = Object.getPrototypeOf(obj);
}
return [...result];
}
그런 다음 반복합니다 .for-of 루프를 사용하십시오.
사용 : Object.values()
우리는 인수로 객체를 전달하고 반환 값으로 값의 배열을받습니다.
주어진 객체 자체 열거 가능한 속성 값의 배열을 반환합니다. for in
루프 를 사용 하지만 프로토 타입의 속성없이 동일한 값을 얻을 수 있습니다. 이 예제는 아마도 상황을 더 명확하게 만들 것입니다.
function person (name) {
this.name = name;
}
person.prototype.age = 5;
let dude = new person('dude');
for(let prop in dude) {
console.log(dude[prop]); // for in still shows age because this is on the prototype
} // we can use hasOwnProperty but this is not very elegant
// ES6 +
console.log(Object.values(dude));
// very concise and we don't show props on prototype
다음은 PHP의 array_values ()와 유사한 함수입니다
function array_values(input) {
var output = [], key = '';
for ( key in input ) { output[output.length] = input[key]; }
return output;
}
ES6 이상을 사용하는 경우 객체 값을 얻는 방법은 다음과 같습니다.
Array.from(values(obj));
이후 ES7에Object.values(<object>)
내장 될 예정입니다. &
모든 브라우저가 지원할 때까지 기다릴 때까지 함수 안에 넣을 수 있습니다.
Object.vals=(o)=>(Object.values)?Object.values(o):Object.keys(o).map((k)=>o[k])
그런 다음 :
Object.vals({lastname:'T',firstname:'A'})
// ['T','A']
const myObj = { a:1, b:2, c:3 }
모든 가치를 얻으십시오 :
가장 짧은 방법 :
const myValues = Object.values(myObj)
const myValues = Object.keys(myObj).map(key => myObj[key])
에서 ECMAScript5의 사용
keys = Object.keys(object);
그렇지 않으면 브라우저가 지원하지 않는 경우 잘 알려진 for..in loop
for (key in object) {
// your code here
}
object[key]
루프에서 값을 얻는 데 사용할 수 있기 때문에 값을 얻으려는 경우에 유용합니다 .
for..in
정말 아무것도 얻을하지 않도록 (및 hasOwnProperty) ... 나는 인 ECMAScript 5 정의 바란다 Object.pairs
(와 Object.items
에 대한 [[key, value], ..]
)하지만, 슬프게도, 그것은하지 않습니다.
이전 브라우저는 지원하지 않기 때문에 이제 Dojo Toolkit을 사용 합니다 Object.values
.
require(['dojox/lang/functional/object'], function(Object) {
var obj = { key1: '1', key2: '2', key3: '3' };
var values = Object.values(obj);
console.log(values);
});
출력 :
['1', '2', '3']