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

是否有可能通过JavaScript对象中的属性循环? 例如,我有一个JavaScript对象定义为:

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

属性将被dynamic地添加到这个对象。 有没有办法让我循环,做一个检查,如果一个财产存在? 如果是这样,怎么样?

是的,你可以和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

使用_.forOwn()

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

https://lodash.com/docs#forOwn

请注意, forOwn检查hasOwnProperty ,因为在循环对象的属性时通常需要执行此操作。 forIn不做这个检查。

对于你所说的“检查财产是否存在”的愿望,你可以直接使用Lo-Dash的。

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

在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 

理解为什么你需要用lodash做这个将是有帮助的。 如果你只是想检查一个对象是否存在一个键,你不需要lodash。

 myObject.options.hasOwnProperty('property'); 

如果您正在查看是否存在值,则可以使用_.invert

 _.invert(myObject.options)[value]