使用Lodash循环JavaScript对象中的属性

use*_*277 113 javascript lodash

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

myObject.options = {
  property1: 'value 1',
  property2: 'value 2'
};
Run Code Online (Sandbox Code Playgroud)

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

dje*_*lin 581

使用_.forOwn().

_.forOwn(obj, function(value, key) { } );
Run Code Online (Sandbox Code Playgroud)

https://lodash.com/docs#forOwn

请注意,在循环对象的属性时通常需要进行forOwn检查hasOwnProperty.forIn不做这个检查.

  • 非常重要的是要注意`key`是第二个参数,但它是有道理的 (22认同)

ste*_*ecb 32

是的你可以和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];
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:接受的答案(_.forOwn())应为/sf/answers/1491773181/

  • 在这种情况下,提供两个答案都会很好. (37认同)
  • +我知道他们想要lodash功能风格,我的只是一种方式让OP了解你可以根据一个库循环一个obj w out(如果他只是想要包括lodash在内的那个功能) (6认同)
  • 使用“lodash”,而不是仅通过不需要烦人的“hasOwnProperty”检查来证明这是合理的 (4认同)

Joh*_*yHK 17

对于您所说的"检查房产是否存在"的愿望,您可以直接使用Lo-Dash has.

var exists = _.has(myObject, propertyNameToCheck);
Run Code Online (Sandbox Code Playgroud)


Kev*_*ary 7

你绝对可以像 stecb 展示的那样使用 vanilla JS 做到这一点,但我认为这each是关于如何使用 lodash 做到这一点的核心问题的最佳答案。

_.each( myObject.options, ( val, key ) => { 
    console.log( key, val ); 
} );
Run Code Online (Sandbox Code Playgroud)

就像 JohnnyHK 提到的,也has有对用例有用的方法,但从最初所说的set可能更有用。假设你想像你提到的那样动态地向这个对象添加一些东西:

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

_.set( myObject.options, dynamicKey, dynamicValue );
Run Code Online (Sandbox Code Playgroud)

根据原始描述,我就是这样做的。