자바 스크립트에서 (키, 값)을 반복하는 방법은 무엇입니까?


335

다음 형식의 사전이 있습니다.

dictionary = {0: {object}, 1:{object}, 2:{object}}

다음과 같은 작업을 수행하여이 사전을 반복하는 방법

for((key,value) in dictionary){
  //Do stuff where key would be 0 and value would be the object
}

3
for (let [key, value] of Object.entries(obj))바벨이 필요합니다.
elclanrs


1
@elclanrs 그것은 ES2016에 있으며 아직 표준화되지 않았습니다 :-)
thefourtheye


@dooagain, 그것은이 질문의 배열이 아닙니다.
zangw

답변:


479

tl; dr

  1. ECMAScript 5에서는 불가능합니다.
  2. ECMAScript 2015에서는 Maps를 사용 하여 가능합니다 .
  3. ECMAScript 2017에서는 쉽게 사용할 수 있습니다.

ECMAScript 5 :

아니요, 객체로는 불가능합니다.

for..in, 또는 Object.keys이와 같이 반복해야합니다.

for (var key in dictionary) {
    // check if the property/key is defined in the object itself, not in parent
    if (dictionary.hasOwnProperty(key)) {           
        console.log(key, dictionary[key]);
    }
}

참고 :if 위 의 조건은 dictionary객체 자체의 속성을 반복하려는 경우에만 필요합니다 . 때문에for..in상속 된 모든 열거 가능한 속성을 반복 입니다.

또는

Object.keys(dictionary).forEach(function(key) {
    console.log(key, dictionary[key]);
});

ECMAScript 2015

ECMAScript 2015에서는을 사용하여 Map객체 를 사용 하고 반복 할 수 있습니다 Map.prototype.entries. 해당 페이지에서 인용 한 예,

var myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

var mapIter = myMap.entries();

console.log(mapIter.next().value); // ["0", "foo"]
console.log(mapIter.next().value); // [1, "bar"]
console.log(mapIter.next().value); // [Object, "baz"]

또는 for..of이와 같이 반복 하십시오.

'use strict';

var myMap = new Map();
myMap.set("0", "foo");
myMap.set(1, "bar");
myMap.set({}, "baz");

for (const entry of myMap.entries()) {
  console.log(entry);
}

산출

[ '0', 'foo' ]
[ 1, 'bar' ]
[ {}, 'baz' ]

또는

for (const [key, value] of myMap.entries()) {
  console.log(key, value);
}

산출

0 foo
1 bar
{} baz

ECMAScript 2017

ECMAScript 2017에는 새로운 기능이 도입되었습니다 Object.entries. 이를 사용하여 원하는대로 객체를 반복 할 수 있습니다.

'use strict';

const object = {'a': 1, 'b': 2, 'c' : 3};
for (const [key, value] of Object.entries(object)) {
  console.log(key, value);
}

산출

a 1
b 2
c 3

1
여기에 기본적인 의심이 있습니다. 나는 서버 측의 자바 스크립트 인 node.js 에서이 작업을 수행하는 방법을 찾고 여기에 착륙했습니다. 필자의 경우 어떤 ES 버전이 적용되는지 어떻게 알 수 있습니까? 또한 일반 자바 스크립트 사용자의 경우 ES 버전이 클라이언트 브라우저에 따라 다르다는 것을 이해하면서 지원하는 올바른 방법은 무엇입니까?
Sandeepan Nath

2
당신은 같은 웹 사이트를 사용할 수 있습니다 @SandeepanNath node.green 알고 특정 ES의 기능은 Node.js.에서 지원되는 경우 브라우저와 관련하여 사람들은 일반적으로 널리 지원되는 버전 (이 경우 ES5)을 대상으로합니다. 이 외에도 Babel 과 같은 변환기는 ES2015 + 코드를 ES5로 변환하는 데 도움이됩니다.
thefourtheye

1
나는 Object.keys(dictionary).forEach(function(key) {…매우 읽기 쉽고 호환되는 것을 좋아 합니다.
ctrl-alt-delor

6
Object.entries(object).forEach(([key, val]) => {...});
크림슨


60

이 시도:

dict = {0:{1:'a'}, 1:{2:'b'}, 2:{3:'c'}}
for (var key in dict){
  console.log( key, dict[key] );
}

0 Object { 1="a"}
1 Object { 2="b"}
2 Object { 3="c"}

42

Object.entries()방법은 ES2017에 지정 되었으며 모든 최신 브라우저에서 지원됩니다 .

for (const [ key, value ] of Object.entries(dictionary)) {
    // do something with `key` and `value`
}

설명:

  • Object.entries()객체를 가져 와서 { a: 1, b: 2, c: 3 }키-값 쌍의 배열로 바꿉니다 : [ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ].

  • 이를 통해 for ... of생성 된 배열의 항목을 반복 할 수 있습니다.

  • 우리 때문에 보장 소위 반복 배열의 각 항목은 두 항목 배열 자체 즉, 우리가 사용 destructuring 직접 지정 변수 keyvalue그 제 1 및 제 2 항목.


슬픈 것은 사람들이 여전히 Internet Explorer를 사용한다는 것입니다
Edward

나는 고통스럽게 알고 있습니다. Babel과 polyfill.io는 이것을 해결하지만 즐겁지 않습니다.
Loilo

19

다음과 같이 할 수 있습니다 :

dictionary = {'ab': {object}, 'cd':{object}, 'ef':{object}}
var keys = Object.keys(dictionary);

for(var i = 0; i < keys.length;i++){
   //keys[i] for key
   //dictionary[keys[i]] for the value
}

3
아름다운! ECMAscript 5에서 귀하의 답변이 어떻게 작동하는지 좋아합니다. 당신은 더 많은 공감대를 가질 가치가 있습니다.
liljoshu

18

이 시도:

var value;
for (var key in dictionary) {
    value = dictionary[key];
    // your code here...
}

9

2020에 오신 것을 환영합니다 * ES6의 드롤 *

여기에 꽤 오래된 답변이 있습니다-파괴를 활용하십시오. 제 생각에는 이것은 객체를 반복하는 가장 좋은 (매우 읽기 쉬운) 방법입니다.

Object.entries(myObject).forEach(([k,v]) => {
    console.log("The key: ",k)
    console.log("The value: ",v)
})

그냥 참고 : 교체 할 경우 forEachmap위가 집계 값에 다음 가능합니다. map그런 다음 위의 값 목록을 반환하여 코드를 다른 방식으로 단순화 할 수 있습니다.
Lazerbeak12345


1

swagger-ui.js 사용

당신은 이것을 할 수 있습니다-

_.forEach({ 'a': 1, 'b': 2 }, function(n, key) {
    console.log(n, key);
 });

0

아래 스크립트를 사용할 수 있습니다.

var obj={1:"a",2:"b",c:"3"};
for (var x=Object.keys(obj),i=0;i<x.length,key=x[i],value=obj[key];i++){
    console.log(key,value);
}

출력
1 a
2 b
c 3


# 출력 #c 3 # 1 a # 2 b
Michael Piper

4
답변에 설명을 추가하십시오. 코드만으로는 도움이되지 않습니다. 또한, 당신은 당신의 답변을 편집 할 수 있습니다, 코멘트는 당신이 사용하는 방식으로 답변에 대한 확장이 아닙니다
Viktor

0

수락 된 답변의 개선으로 중첩을 줄이기 위해 키가 상속되지 않은 경우 대신이 작업을 수행 할 수 있습니다.

for (var key in dictionary) {
    if (!dictionary.hasOwnProperty(key)) {
        continue;
    }
    console.log(key, dictionary[key]);
}

편집 : 여기 에 대한 정보Object.hasOwnProperty

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