JavaScript의 For..In 루프-키 값 쌍


414

foreachJavaScript에서 PHP 루프 와 같은 것을 수행 할 수있는 방법이 있는지 궁금합니다 . 내가 찾고있는 기능은 다음 PHP 스 니펫과 같습니다.

foreach($data as $key => $value) { }

JS for..in루프를 보고 있었지만를 지정할 방법이없는 것 같습니다 as. '정상'for 루프 ( for(var i = 0; i < data.length; i++) 로이 작업을 수행 하면 키 => 값 쌍을 가져 오는 방법이 있습니까?

답변:


216

ES6를 기본적으로 또는 Babel (js 컴파일러) 과 함께 사용할 수있는 경우 다음을 수행 할 수 있습니다.

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

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

이 출력을 인쇄합니다 :

a 1
b 2
c 3

Object.entries()메소드는 루프에서 [key, value]제공 한 것과 동일한 순서로 주어진 객체 자체의 열거 가능한 속성 쌍 의 배열을 반환합니다 (차이 루프는 프로토 타입 체인의 속성도 열거한다는 점이 다릅니다) .for...in

그것이 도움이되기를 바랍니다! =)


1
이것은 "개체의 키에 대한 것보다 더 나은 성능을 제공하는 개체 [키]에 의한 가치를 얻는 것"과 비교할 때 완벽하게 작동합니다.
lsheng

1
이 특정 경우에는 Object.entries호출로 인해 느리다고 가정합니다 . 그래도 테스트를 실행하지 않았습니다.
프란체스코 카 술라

6
이것은 for 루프에서 키와 값을 모두 잡는 방법에 대한 질문에 대한 가장 좋은 대답입니다.
cipak

4
질문에 답변 할 수 없었지만 질문에 실제로 답변 했으므로 수락 된 답변을 업데이트해야합니다.
Marc Qualie

1
이 질문을 확인하고 싶을 수도 있습니다. stackoverflow.com/questions/47213651/… 이 유형의 구문이 권장됨을 나타냅니다. Object.keys (myObject) .forEach (key => {...
Will59

519
for (var k in target){
    if (target.hasOwnProperty(k)) {
         alert("Key is " + k + ", value is " + target[k]);
    }
}

hasOwnPropertytarget프로토 타입에서 상속하지 않고 해당 속성이 실제로 있는지 확인하는 데 사용됩니다 . 조금 더 간단합니다 :

for (var k in target){
    if (typeof target[k] !== 'function') {
         alert("Key is " + k + ", value is" + target[k]);
    }
}

그것은 단지 확인 k하는 방법 아닌 (것처럼 target입니다 array당신이 방법을 많이 얻을 것이다는, 예를 들어, 경고 indexOf, push, pop, 등.)


87
"자체"속성 만 반복하는 또 다른 방법은 Object.keys입니다. Object.keys(target).forEach(function (key) { target[key]; });.
katspaugh

3
경우 작업을하지 않을 target사용하여 생성되는 Object.create(null)코드를 변경해야합니다, target.hasOwnProperty(k)> -Object.prototype.hasOwnProperty.call(target,k)
Azder

질문 예제에 주어진 변수를 사용하지 않는 이유는 무엇입니까? 여기에 무엇 k, target그리고 property? 나를 위해, 자바 스크립트가 아닌이 정의되지 않은 영역 :)
Gediminas

2
Object.keys (target) .forEach ((key) => {target [key];}); for Angular
askilondz

315

아무도 Object.keys언급하지 않았으므로 언급하겠습니다.

Object.keys(obj).forEach(function (key) {
   // do something with obj[key]
});

3
참고 : IE8 이하에서는 지원되지 않습니다.
Edwin Stoteler

1
이 시점에서 ES5 심을 사용해야합니다. 멋진 ES6 미래에 살고 있다면 for of tc39wiki.calculist.org/es6/for-of
goatslacker

17
"예외를 던지는 것 이외의 forEach () 루프를 중지하거나 중단시킬 수있는 방법이 없습니다"
rluks

Object.keys (obj) .forEach ((key) => {}); for Angular
askilondz

ES6에서 작동하지 않거나 이해하지 못합니다. Felix는 아래에 더 좋고 더 읽기 쉬운 대답이 있습니다. data.forEach (function (value, index) {console.log (index); // 0, 1, 2 ...});
gtamborero

115

...에서 당신을 위해 일할 것입니다.

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

최신 JavaScript에서는 다음을 수행 할 수도 있습니다.

for ( const [key,value] of Object.entries( obj ) ) {

}

64
var obj = {...};
for (var key in obj) {
    var value = obj[key];

}

PHP 문법은 설탕 일뿐입니다.


이것은 또한 상속 된 모든 속성에서 반복됩니다. 이를 피하려면 .hasOwnProperty ()를 사용하십시오.
LSerni

24

나는 그것이 i열쇠 라는 것을 알고 가치를 통해 얻을 수 있다고 가정합니다 data[i](그리고 바로 가기를 원합니다).

ECMAScript5는 배열에 forEach [MDN] 을 도입 했습니다 (배열이있는 것 같습니다).

data.forEach(function(value, index) {

});

MDN 설명서는이를 지원하지 않는 브라우저를위한 shim을 제공합니다.

물론 이것은 객체에는 작동하지 않지만 비슷한 기능을 만들 수 있습니다.

function forEach(object, callback) {
    for(var prop in object) {
        if(object.hasOwnProperty(prop)) {
            callback(prop, object[prop]);
        }
    }
}

질문에 태그를 지정 했으므로 jQuery는 배열과 객체 구조를 모두 반복 하는 $.each [docs] 를 제공합니다 .


그것은 forEachobject가 아니라 Array forEach입니다.

2
그래서? 분명히 OP가 어레이를 반복하고 있습니다.
Felix Kling

또한 Mozilla (Firefox, SpiderMonkey-C, Rhino & c)에는 for each구문 을 허용하는 비표준 확장이 있습니다 . for each (let val in myObj) console.log(val);.
katspaugh

2
@ katspaugh : 맞습니다. 그러나 모질라 전용이기 때문에별로 유용하지 않습니다.
Felix Kling

답변 주셔서 감사합니다. 제공해 주신 정보를 읽어 드리겠습니다. 답을 시작할 때 당신의 가정은 옳았습니다. 저는이 프로젝트로 인해 너무 집중해서 잊어 버릴 수 없다는 것을 제외하고는 알고있었습니다. 감사합니다.
카바레


9
for (var key in myMap) {
    if (myMap.hasOwnProperty(key)) {
        console.log("key =" + key);
        console.log("value =" + myMap[key]);
    }
}

자바 스크립트에서 모든 객체에는 메타 정보가있는 여러 내장 키-값 쌍이 있습니다. 객체의 모든 키-값 쌍을 반복하면 반복됩니다. hasOwnProperty ()를 사용하면이를 걸러냅니다.


2

ES6은 이와 같이 사용할 수있는 Map.prototype.forEach (콜백)을 제공합니다

myMap.forEach(function(value, key, myMap) {
                        // Do something
                    });

2
매개 변수 myMap는 무엇입니까?
phil294

지도는 객체가 아닙니다. 그것들은 완전히 별개의 것입니다.
Dakusan

2
forEach 함수는 배열의 '키'를 포함하지 않고 현재 반복하는 요소의 색인을 더 포함합니다.
Francis Malloch

2
let test = {a: 1, b: 2, c: 3};
Object.entries(test).forEach(([key, value]) => console.log(key, value))

// a 1
// b 2
// c 3

5
이해할 수없는 일반 코드를 게시하는 대신 게시 한 코드로 설명을 추가 할 수 있습니다.
AaoIi

Object.entries는 원본 객체의 키 / 값 쌍을 기반으로 배열 배열을 가져옵니다 [['a', 1],['b',2],['c',3]]. 는 forEach키 / 값 배열의 각을 해체하고 두 개의 변수를 설정 key하고 value여기에 출력 - 당신이 함수에서 원하는대로 사용할 수, console.log.
Mark Swardstrom

1

이를 위해 'for in'루프를 사용할 수 있습니다.

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


1

당신이 사용하는 경우 Lodash을 , 당신은 사용할 수 있습니다_.forEach

_.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
  console.log(key + ": " + value);
});
// => Logs 'a: 1' then 'b: 2' (iteration order is not guaranteed).

1

이 질문이 작성된 후 지난 몇 년 동안 Javascript는 몇 가지 새로운 기능을 추가했습니다. 그중 하나가 Object.Entries 메소드입니다.

다음 코드 스 니펫은 MDN에서 직접 복사


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

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

-2

예, 자바 스크립트에서도 연관 배열을 가질 수 있습니다.

var obj = 
{
    name:'some name',
    otherProperty:'prop value',
    date: new Date()
};
for(i in obj)
{
    var propVal = obj[i]; // i is the key, and obj[i] is the value ...
}

@PaulPRO ... 자바 스크립트의 모든 것은 키-값 쌍입니다 (따라서 객체는 실제로 키-값 쌍의 연관 배열입니다 ...)
Alex Pacurar

@AlexPacurar 및 연관 배열에는 순서가 있습니다. 개체가 정렬되지 않았습니다. 그게 큰 차이
Raynos

@Raynos 당신이 옳을 수도 있습니다 ... 객체가 정렬되지 않은 방법을 정확하게 설명하는 데 큰 도움이 될 것입니다 ... 위의 예에서 for 루프의 'i'는 [name, otherProperty, 그리고 마지막으로 날짜] ... 그래서 어떤 상황에서 객체의 속성 순서가 혼합됩니까?
Alex Pacurar

@AlexPacurar 객체를 반복하는 특정 순서는 브라우저마다 다릅니다. 일부는 알파벳 순으로, 일부는 정의 순서 등을 수행합니다.
Raynos

3
@Raynos : 연관 배열이 반드시 주문됩니까? 나는 종종 더 일반적으로 사용되는 용어를 보았다. 예를 들어 연관 배열 Wikipedia article에 있습니다.
Jeremy Banks

-8
var global = (function() {
   return this;
})();

// Pair object, similar to Python

function Pair(key, value) {
    this.key = key;
    this.value = value;

    this.toString = function() {
       return "(" + key + ", " + value + ")";
    };
}

/**
 * as function
 * @param {String} dataName A String holding the name of your pairs list.
 * @return {Array:Pair} The data list filled
 *    with all pair objects.
 */
Object.prototype.as = function(dataName) {
    var value, key, data;
    global[dataName] = data = [];

    for (key in this) {
       if (this.hasOwnProperty(key)) {
          value = this[key];

          (function() {
             var k = key,
                 v = value;

            data.push(new Pair(k, v));
          })();
       }
    }

    return data;
};

var d = {
   'one': 1,
   'two': 2
};

// Loop on your (key, list) pairs in this way
for (var i = 0, max = d.as("data").length; i < max; i += 1) {
   key = data[i].key;
   value = data[i].value;

   console.log("key: " + key + ", value: " + value);
}

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