使用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]