키를 모르고 JavaScript 객체의 모든 속성 값을 얻는 방법은 무엇입니까?


답변:


447

간단한 for..in루프 를 사용하여 :

for(var key in objects) {
    var value = objects[key];
}

90
상속되는 프로토 타입 객체의 속성에주의하십시오. 참조 : hasOwnProperty ()
올리브

102
이 답변을 읽고 있다면 , 다른 답을 반드시 읽어야 합니다
mgarciaisaia

18
이 답변을 읽고 문자열을 다룰 수 있다면 분명히 자바 스크립트를 사용해야합니다.

위의 답변을 읽고 얼굴에 JavaScript를 펀치하고 싶다면 lodash
slugmandrew

enumerable플래그가 false로 설정된 속성은 포함하지 않을 것 입니다. 이것은 무엇보다도 클래스 메소드를 반복하지 않지만 다른 방법으로 작성된 메소드를 반복한다는 것을 의미합니다.
rich remer

1012

지원해야하는 브라우저에 따라 여러 가지 방법으로 수행 할 수 있습니다. 야생에서 압도적 인 대다수의 브라우저는 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 수없는 이유입니다 ). 새로운ReflectECMAScript 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에 코드를 컴파일하려면, 당신은이 답변의 기능 모두에 액세스 할 수 있습니다.


9
수락 된 답변이 불완전하기 때문에 수락 된 (또는 적어도 더 찬성 한) 답변이어야합니다 (@olive가 이것을 지적합니다).
0xc0de

그것은 모든 소위 속임수의 수치이며, 우리는 여전히 obj두 번 언급해야합니다 . 도우미 기능을 만드는 것이 불가피하다고 생각합니까? values ​​(obj)와 같은 것.
Steven Haryanto

이러한 방법 중 하나를 심으로 사용할 수 있습니다. 예 :Object.values = obj => Object.keys(obj).map(key => obj[key]);
qubyte

1
ECMA 5 솔루션은 모든 최신 브라우저에서 작동해야합니다. ECMA 6은 아직 확정되지 않았으며 모든 브라우저에서 지원이 예비되었습니다. Chrome에서는 ECMA 6이 부분적으로 구현되었지만 비활성화되었습니다. Firefox에서는 지원이 더 좋지만 언급 된 배열 이해가 잘못되었습니다. 나는 미래 시제를 사용하는 것이 이것을 암시한다고 생각했다. @JacekLampart, 어떤 솔루션에서 오류가 발생 했습니까?
qubyte

2
ES2017이 Object.values ​​() 메소드를 얻기 위해 기다려야하는 이유를 상상할 수 없습니다.
Herbertusz

31

다음은 값을 배열로 가져 오기위한 재사용 가능한 함수입니다. 프로토 타입도 고려합니다.

Object.values = function (obj) {
    var vals = [];
    for( var key in obj ) {
        if ( obj.hasOwnProperty(key) ) {
            vals.push(obj[key]);
        }
    }
    return vals;
}

15
수정 Object은 큰 문제가되지 않습니다 ( Object.keys일반적인 shim). Object 프로토 타입을 수정하려고 생각하고있을 것입니다.
sandstrom

왜 테스트해야 hasOwnProperty()합니까? 해당 객체의 루프 내에서 키가 어떻게 반복됩니까?
1252748 1

4
Google it @ Thomas, 중요합니다. 프로토 타입 체인의 속성이있을 수 있습니다.
Joe

28

Underscore.js에 액세스 할 수 있으면 다음 _.values과 같은 기능을 사용할 수 있습니다 .

_.values({one : 1, two : 2, three : 3}); // return [1, 2, 3]

@MathieuAmiot-설명이 필요하세요?
Paden

lodash는 밑줄을 대체하는 API 호환 대체품입니다.
Mathieu Amiot

@Paden 여기 SO에 대한 관련 질문이 있습니다 : stackoverflow.com/questions/13789618/…
jichi

2
lodash는이를 위해 필요하지 않으며 코드 기반을 부 풀릴 것입니다.
dman

14

정말로 값 배열을 원한다면 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의 키로 설정됩니다.


9

ES5 Object.keys

var a = { a: 1, b: 2, c: 3 };
Object.keys(a).map(function(key){ return a[key] });
// result: [1,2,3]

3
이것이 다운 보트 된 이유는 무엇입니까? 나는 이것이 가장 깨끗한 해결책 중 하나라고 말합니다.
Sebastian Hojas

모르겠습니다. 왜이 다운 투표가 이루어 졌습니까? 이것은 라이브러리 나 다른 유틸리티를 사용하지 않고 js에서 가장 쉽고 순수한 솔루션입니다.
sanjeev shetty 2016

5

키를 반복 할 수 있습니다.

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

2
상속 된 속성을 피하려면`hasOwnProperty () '도 확인해야합니다.
0xc0de

3

CofeeScript 시대에 사람들을 일찍 적응시키는 사람들에게는 여기에 해당하는 또 다른 것이 있습니다.

val for key,val of objects

objects다시 입력 할 수 있고 가독성이 떨어 지기 때문에 이것보다 낫습니다 .

objects[key] for key of objects

3

다음과 같은 폴리 필을 사용하십시오.

if(!Object.values){Object.values=obj=>Object.keys(obj).map(key=>obj[key])}

그런 다음 사용

Object.values(my_object)

3) 이익!



2

분명히 내가 최근에 배운대로 이것은 가장 빠른 방법입니다.

var objs = {...};
var objKeys = Object.keys(obj);
for (var i = 0, objLen = objKeys.length; i < objLen; i++) {
    // do whatever in here
    var obj = objs[objKeys[i]];
}

이 예제의 코드 펜이나 jsfiddle을 넣을 수 있습니까? 감사.
Chris22

2

이 질문은 상속 가능하고 열거 불가능한 속성을 원하는지 여부를 지정하지 않습니다.

또한 모든 것을 상속 된 속성과 비 열거 속성을 얻기위한 질문 구글이 쉽게 찾을 수는.

그에 대한 나의 해결책은 다음과 같습니다.

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 루프를 사용하십시오.


1

사용 : 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


1
const object1 = {
  a: 'somestring',
  b: 42
};

for (let [key, value] of Object.entries(object1)) {
  console.log(`${key}: ${value}`);
}

// expected output:
// "a: somestring"
// "b: 42"
// order is not guaranteed

0

다음은 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));

어떤 이유로 든 values ​​()는 Chrome 및 Firefox에서 작동하지만 iojs / node에서는 작동하지 않습니다.
jaggedsoft

0

ES7과 호환 일부 브라우저는 아직 지원하지 않습니다

이후 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']

브라우저가 ES7과 호환되면 코드에서 아무것도 변경할 필요가 없습니다.


0

나는 조금 늦었다는 것을 알고 있지만 여기 에 새로운 파이어 폭스 47 방법에 대한 shim 이 있습니다.Object.values

Object.prototype.values = Object.prototype.values || function(obj) {
  return this.keys(obj).map(function(key){
    return obj[key];
  });
};

0

Object.entries가 더 나은 방식으로 수행합니다.

  var dataObject = {"a":{"title":"shop"}, "b":{"title":"home"}}
 
   Object.entries(dataObject).map(itemArray => { 
     console.log("key=", itemArray[0], "value=", itemArray[1])
  })


0

const myObj = { a:1, b:2, c:3 }

모든 가치를 얻으십시오 :

  • 가장 짧은 방법 :

    • const myValues = Object.values(myObj)
  • const myValues = Object.keys(myObj).map(key => myObj[key])


-1
var objects={...}; this.getAllvalues = function () {
        var vls = [];
        for (var key in objects) {
            vls.push(objects[key]);
        }
        return vls;
    }

-5

에서 ECMAScript5의 사용

 keys = Object.keys(object);

그렇지 않으면 브라우저가 지원하지 않는 경우 잘 알려진 for..in loop

for (key in object) {
    // your code here
}

17
질문은 키가 아닌 값을 요구하는 것이 었습니다.
zachelrath

@zachelrath 당신이 맞아요. -그러나이 스크립트는 키를 알고있을 때 object[key]루프에서 값을 얻는 데 사용할 수 있기 때문에 값을 얻으려는 경우에 유용합니다 .
fridojet

2
@fridojet 그러나이 함께 할 수있는 for..in정말 아무것도 얻을하지 않도록 (및 hasOwnProperty) ... 나는 인 ECMAScript 5 정의 바란다 Object.pairs(와 Object.items에 대한 [[key, value], ..])하지만, 슬프게도, 그것은하지 않습니다.
user2246674

-8

이전 브라우저는 지원하지 않기 때문에 이제 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']

5
엄밀히 말하면 배열이 올바르지 않습니다. 숫자 배열 대신 문자열 배열이 있습니다.
qubyte

-10

사용하다

console.log(variable)

Chrome을 사용하는 경우 Ctrl + Shift + j를 사용하여 콘솔을 엽니 다.

이동 >> 콘솔

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.