【发布时间】:2014-02-14 03:57:12
【问题描述】:
是否可以遍历 JavaScript 对象中的属性?例如,我有一个 JavaScript 对象定义如下:
myObject.options = {
property1: 'value 1',
property2: 'value 2'
};
属性将动态添加到此对象。有没有办法让我循环并检查属性是否存在?如果有,怎么做?
【问题讨论】:
标签: javascript lodash
是否可以遍历 JavaScript 对象中的属性?例如,我有一个 JavaScript 对象定义如下:
myObject.options = {
property1: 'value 1',
property2: 'value 2'
};
属性将动态添加到此对象。有没有办法让我循环并检查属性是否存在?如果有,怎么做?
【问题讨论】:
标签: javascript lodash
是的,你可以,并且不需要 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
【讨论】:
lodash 而不是这只是因为不需要烦人的hasOwnProperty 检查
使用_.forOwn()。
_.forOwn(obj, function(value, key) { } );
https://lodash.com/docs#forOwn
请注意,forOwn 会检查 hasOwnProperty,这在循环对象的属性时通常需要这样做。 forIn 不做这个检查。
【讨论】:
key是第二个参数,但它是有意义的
如果您希望“检查属性是否存在”,您可以直接使用 Lo-Dash 的has。
var exists = _.has(myObject, propertyNameToCheck);
【讨论】:
了解为什么需要使用 lodash 执行此操作会很有帮助。如果只想检查对象中是否存在键,则不需要 lodash。
myObject.options.hasOwnProperty('property');
如果您想查看某个值是否存在,您可以使用_.invert
_.invert(myObject.options)[value]
【讨论】:
在 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
【讨论】:
让我们以下面的对象为例
let obj = { property1: 'value 1', property2: 'value 2'};
首先获取obj中的所有key
let keys = Object.keys(obj) //it will return array of keys
然后循环遍历它
keys.forEach(key => //your way)
把所有东西放在一起
Object.keys(obj).forEach(key=>{/*code here*/})
【讨论】:
你绝对可以像 stecb 展示的那样使用 vanilla 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 );
根据原始描述,我就是这样做的。
【讨论】:
如果您只想循环映射属性值,请使用_.mapValues
【讨论】:
如果您正在检查,如果问题中所述的属性存在于对象中,您可以使用 lodash libray _.has 方法
_.has(object, path)
让我给你一个例子,如何使用它。
考虑一个对象
const user = {
name : "prabhat",
age: 27,
height: "5.7"
}
如果要检查对象中是否存在name属性,可以使用_.has方法,如下
_.has(user, 'name') //true
_.has(user, 'address') //false
您将获得boolean true/false 作为回报。
【讨论】: