使用Lodash遍历JavaScript对象中的属性


123

是否可以遍历JavaScript对象中的属性?例如,我有一个如下定义的JavaScript对象:

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

属性将动态添加到此对象。有没有办法让我循环浏览并检查属性是否存在?如果是这样,怎么办?

Answers:


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函数式的样式,这只是让OP了解u可以根据库循环w / out obj的一种方法(以防他只想要不包含lodash的功能)
stecb

39
在这种情况下,提供两个答案都很好。
2015年

1
使用lodash而不是仅通过不需要烦人的hasOwnProperty检查就可以证明其合理性
Mugen

601

使用_.forOwn()

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

https://lodash.com/docs#forOwn

请注意,在循环对象的属性时,通常需要执行forOwnchecks hasOwnPropertyforIn不执行此检查。


22
非常重要的一点key是,这是第二个参数,但这很有意义
Phil

18

如果您希望“检查属性是否存在”,可以直接使用Lo-Dash的has

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

3

可以肯定地使用stecb所示的香草JS来做到这一点,但是我认为这each是解决lodash核心问题的最佳答案。

_.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。该循环通过在提供的迭代器对象上依次调用next()方法并使用返回的值作为每次迭代的值来对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]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.