是否可以遍历JavaScript对象中的属性?例如,我有一个JavaScript对象定义如下:
myObject.options = {
property1: 'value 1',
property2: 'value 2'
};
属性将动态添加到此对象。有没有办法让我循环检查一个属性是否存在?如果是这样,怎么样?
答案 0 :(得分:561)
使用_.forOwn()
。
_.forOwn(obj, function(value, key) { } );
https://lodash.com/docs#forOwn
请注意,forOwn
检查hasOwnProperty
,因为在循环对象的属性时通常需要这样做。 forIn
不会进行此项检查。
答案 1 :(得分:31)
是的,你可以和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
答案 2 :(得分:14)
对于您所说的“检查财产是否存在”的愿望,您可以直接使用Lo-Dash的has
。
var exists = _.has(myObject, propertyNameToCheck);
答案 3 :(得分: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*/})
答案 4 :(得分:1)
在ES6中,还可以使用for..of
循环迭代对象的值。但是,对于JavaScript对象,这并不是开箱即用的,因为您必须在对象上定义@@ iterator属性。其工作原理如下:
for..of
循环要求"对象迭代" (让我们将它称为迭代器对象的obj1。循环通过在提供的迭代器对象上连续调用next()方法并使用返回的值作为循环的每次迭代的值来迭代obj1。以下是一个例子:
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
答案 5 :(得分:0)
了解为什么需要使用lodash执行此操作会很有帮助。如果您只想检查对象中是否存在密钥,则不需要lodash。
myObject.options.hasOwnProperty('property');
如果您想查看某个值是否存在,可以使用_.invert
_.invert(myObject.options)[value]
答案 6 :(得分:0)
您绝对可以使用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 );
根据原始说明,这就是我的做法。
答案 7 :(得分:0)
如果您只想循环映射属性值,请使用 _.mapValues