[javascript] For Of 루프에서 객체 사용

for of 루프에서 객체를 사용할 수없는 이유는 무엇입니까? 아니면 브라우저 버그입니까? 이 코드는 Chrome 42에서 작동하지 않으며 undefined는 함수가 아닙니다.

test = { first: "one"}

for(var item of test) {
  console.log(item)
}



답변

for..of 루프 뿐만 아니라 객체, 배열과 같은 반복 가능한 객체를 지원합니다.

객체의 값을 반복하려면 다음을 사용하십시오.

for (var key in test) {
    var item = test[key];
}


답변

다음 구문을 사용할 수 있습니다.

let myObject = {first: "one"};

for(let [key, value] of Object.entries(myObject)) {
    console.log(key, value); // "first", "one"
}

하나, Object.entries 현재 지원이 부족합니다 IE에서 작동하지 않습니다 또는 iOS Safari. 당신은아마 polyfill이 필요할 수 있습니다.


답변

키-값 저장소에 데이터를 저장하는 경우 이를 위해 명시 적으로 설계된 것을 사용하십시오Map .

하지만 객체를 사용해야하는 경우 ES2017 (ES8)에서 다음을 사용할 수 있습니다 Object.values.

const foo = { a: 'foo', z: 'bar', m: 'baz' };
for (let value of Object.values(foo)) {
    console.log(value);
}

그는 아직 지원되지 않으면 polyfill을 사용 의 대체 버전을Object.values()

마지막으로이 구문을 지원하지 않는 이전 환경을 지원하는 경우 forEach및 사용에 의존해야합니다 Object.keys.

var obj = { a: 'foo', z: 'bar', m: 'baz' };
Object.keys(obj).forEach(function (prop) {
    var value = obj[prop];
    console.log(value);
});


답변

ECMAScript 2015 / ES6의 반복자, 반복자 및 for..of 루프

let tempArray = [1,2,3,4,5];

for(element of tempArray) {
  console.log(element);
}

// 1
// 2
// 3
// 4
// 5

하지만 우리가

let tempObj = {a:1, b:2, c:3};

for(element of tempObj) {
   console.log(element);
}
// error

for..of 루프는 Iterables , 즉 Iterator 프로토콜 을 준수 하는 @@ iterator 가있는 객체 에서만 작동 하므로 오류가 발생 합니다 . 즉, 다음 메서드 가있는 객체가 있어야합니다 . next 메소드는 인수를받지 않으며이 두 속성을 가진 객체를 반환해야합니다.

done : 참일 때 시퀀스가 ​​끝났다는 신호, 거짓은 더 많은 값이있을 수 있음을 의미합니다.
value : 시퀀스의 현재 항목입니다.

따라서 for..of 와 함께 작동 하는 객체를 Iterable 로 만들려면 다음을 수행 할 수 있습니다.

1. 신비로운 @@ iterator를 할당 하여 객체를 Iterable 로 만듭니다. Symbol.iterator 속성을 통해 속성 만듭니다 . 방법은 다음과 같습니다.

let tempObj = {a:1, b:2, c:3};

tempObj[Symbol.iterator]= () => ({
next: function next () {
return {
    done: Object.keys(this).length === 0,
    value: Object.keys(this).shift()
     }
    }
  })

for(key in tempObj){
 console.log(key)
}
// a
// b
// c

2. Object.entries 를 사용하면 Iterable .

let tempObj = {a:1, b:2, c:3};

for(let [key, value] of Object.entries(tempObj)) {
    console.log(key, value);
}
// a 1
// b 2
// c 3

3. 사용 Object.keys 사용 , 방법은 다음과 같습니다.

let tempObj = {a:1, b:2, c:3};
for (let key of Object.keys(tempObj)) {
    console.log(key);
}

// a
// b
// c

도움이 되었기를 바랍니다!!!!!!


답변

이 코드로 객체를 반복 가능하게 만들었습니다.

Object.prototype[Symbol.iterator] = function*() {
 for(let key of Object.keys(this)) {
  yield([ key, this[key] ])
} }

용법:

for(let [ key, value ] of {}) { }

대안 :

for(let [ key, value ] of Object.entries({})) { }


답변

객체 리터럴에는 Symbol.iterator 속성 이 없기 때문 입니다. 구체적으로, 당신은 할 수 있습니다 만 반복 처리를 통해 문자열 , 배열 , 지도 , 설정 , 인수 , NodeList를 (하지 널리 지원) 및 발전기용의 루프.

Object Literal 반복을 처리하기 위해 두 가지 옵션이 있습니다.

…에서

for(let key in obj){
    console.log(obj[key]);
}

Object.keys + forEach

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


답변

대답은 아니요입니다. For..Of를 Object 리터럴과 함께 사용할 수 없습니다.

For..Of는 이터 러블 전용이라는 Overv에 동의합니다. for..in으로 키와 값을 반복하기 위해 Objects를 사용하기 때문에 똑같은 질문이있었습니다. 그러나 나는 그것이 ES6 MAPSSETS 의 목적이라는 것을 깨달았습니다 .

let test = new Map();
test.set('first', "one");
test.set('second', "two");

for(var item of test) {
  console.log(item); // "one" "two"
}

따라서 for..In ( hasOwnProperty로 유효성 검사)을 사용할 필요가 없다는 목표를 달성합니다. )을 사용할 필요가없고 Object.keys ()를 사용할 필요가 없다는 .

또한 키는 문자열로 제한되지 않습니다. 숫자, 개체 또는 기타 리터럴을 사용할 수 있습니다.