Lodash를 사용하여 JavaScript 개체의 속성을 반복합니다.


123

JavaScript 객체의 속성을 반복 할 수 있습니까? 예를 들어 다음과 같이 정의 된 JavaScript 개체가 있습니다.

myObject.options = {
  property1: 'value 1',
  property2: 'value 2'
};

속성은이 개체에 동적으로 추가됩니다. 속성이 존재하는지 확인하고 반복하는 방법이 있습니까? 그렇다면 어떻게?

답변:


34

예, 할 수 있으며 lodash는 필요하지 않습니다.

for (var key in myObject.options) {
  // check also if property is not inherited from prototype
  if (myObject.options.hasOwnProperty(key)) { 
    var value = myObject.options[key];
  }
}

편집 : 수락 된 답변 ( _.forOwn () )은 https://stackoverflow.com/a/21311045/528262 여야합니다.


6
+ 나는 그들이 lodash funct 스타일을 원한다는 것을 압니다. 제 것은 OP가 u가 라이브러리에 따라 obj w / out을 루프 할 수 있다는 것을 이해하도록하는 방법 일뿐입니다 (만약 그가 lodash를 포함하지 않고 그 기능을 원할 경우)
stecb

39
어떤 경우에 두 가지 답변을 모두 제공하는 것이 좋았을 것입니다.
flq

1
사용 lodash하지 이것은 단지 성가신 필요하지 않음으로써 정당화 hasOwnProperty체크
Mugen는

601

사용 _.forOwn().

_.forOwn(obj, function(value, key) { } );

https://lodash.com/docs#forOwn

객체의 속성을 반복 할 때 일반적으로 수행해야하는 forOwnchecks를 참고하십시오 hasOwnProperty. forIn이 검사를 수행하지 않습니다.


22
이주의하는 것이 매우 중요 key번째 PARAM이지만 의미가

18

"속성이 존재하는지 확인"하려는 귀하의 명시 적 욕구를 위해 Lo-Dash의 has.

var exists = _.has(myObject, propertyNameToCheck);

3

stecb가 보여준 것처럼 바닐라 JS로 확실히 할 수 있지만 eachlodash로 수행하는 방법에 관한 핵심 질문에 대한 최고의 답변 이라고 생각 합니다.

_.each( myObject.options, ( val, key ) => { 
    console.log( key, val ); 
} );

언급 한 JohnnyHK와 같이 has사용 사례에 도움이되는 방법 도 있지만 원래 언급 된 set방법이 더 유용 할 수 있습니다. 앞서 언급 한대로이 객체에 동적으로 무언가를 추가하고 싶다고 가정 해 보겠습니다.

let dynamicKey = 'someCrazyProperty';
let dynamicValue = 'someCrazyValue';

_.set( myObject.options, dynamicKey, dynamicValue );

원래 설명을 기반으로 한 방법입니다.


2

아래 개체를 예로 들어 보겠습니다.

let obj = { property1: 'value 1', property2: 'value 2'};

먼저 obj의 모든 키를 가져옵니다.

let keys = Object.keys(obj) //it will return array of keys

그리고 그것을 통해 반복

keys.forEach(key => //your way)

그냥 모두 모아

Object.keys(obj).forEach(key=>{/*code here*/})

1

ES6에서는 for..of루프를 사용하여 객체의 값을 반복 할 수도 있습니다 . 그러나 JavaScript 개체의 경우에는 개체에서 @@ iterator 속성을 정의해야하므로 바로 사용할 수 없습니다. 이것은 다음과 같이 작동합니다.

  • for..of루프는 (의 반복자 객체를 OBJ1 부르 자 "물체가 반복 될"묻는다. OBJ1 위에 루프 반복을 연속적으로 제공 반복자 객체에서 다음 () 메소드를 호출하고 각 반복의 값으로 리턴 값을 사용하여 루프의.
  • 반복기 객체는 obj1의 @@ iterator 속성 또는 Symbol.iterator 속성에 정의 된 함수를 호출하여 얻습니다. 이 함수는 직접 정의해야하며 반복기 객체를 반환해야합니다.

다음은 그 예입니다.

const obj1 = {
  a: 5,
  b: "hello",
  [Symbol.iterator]: function() {
    const thisObj = this;
    let index = 0;
    return {
      next() {
        let keys = Object.keys(thisObj);
        return {
          value: thisObj[keys[index++]],
          done: (index > keys.length)
        };
      }
    };
  }
};

이제 for..of루프를 사용할 수 있습니다 .

for (val of obj1) {
  console.log(val);
}    // 5 hello

0

lodash로이 작업을 수행해야하는 이유를 이해하면 도움이 될 것입니다. 객체에 키가 있는지 확인하려는 경우 lodash가 필요하지 않습니다.

myObject.options.hasOwnProperty('property');

값이 있는지 확인하려는 경우 다음을 사용할 수 있습니다. _.invert

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