使用 Lodash 遍历 JavaScript 对象中的属性

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

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

属性将被动态添加到此对象。有没有一种方法可以让我循环访问并检查某个属性是否存在?如果是这样,怎么做?

193591 次浏览

是的,你可以和洛达什是不需要的... 即。

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 ())应该是 < a href = “ https://stackoverflow. com/a/21311045/528262”> https://stackoverflow.com/a/21311045/528262

使用 _.forOwn()

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

Https://lodash.com/docs#forown

请注意,forOwn检查 hasOwnProperty,这是在循环访问对象的属性时通常需要做的事情。forIn不做这个检查。

如果你想“检查一个属性是否存在”,你可以直接使用 Lo-Dash 的 has

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

这将有助于理解为什么你需要这样做与 loash。如果您只是想检查一个键是否存在于一个对象中,则不需要 loash。

myObject.options.hasOwnProperty('property');

如果要查看某个值是否存在,可以使用 _.invert

_.invert(myObject.options)[value]

在 ES6中,还可以使用 for..of循环迭代对象的值。但是,对于 JavaScript 对象,这并不能立即生效,因为必须在对象上定义@@ iterator 属性。工作原理如下:

  • for..of循环要求“对象进行迭代”(对于迭代器对象,我们将其称为 objec1)。循环通过连续调用提供的迭代器对象上的 next ()方法,并使用返回值作为循环每次迭代的值来遍历 objec1。
  • 迭代器对象是通过调用在 objec1.这是您必须自己定义的函数,它应该返回一个迭代器对象的@@ 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

让我们以下面的对象为例

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*/})

您完全可以像 stecb 所展示的那样使用普通的 JS 来完成这项工作,但是我认为 each是关于如何使用 loash 来完成这项工作的核心问题的最佳答案。

_.each( myObject.options, ( val, key ) => {
console.log( key, val );
} );

就像 JohnnyHK 提到的,还有一个 has方法,它对用例是有帮助的,但是从最初声明的 set可能更有用。假设您想要像前面提到的那样动态地向这个对象添加一些内容:

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


_.set( myObject.options, dynamicKey, dynamicValue );

根据最初的描述,我就是这么做的。

如果只想循环到映射属性值,那么使用 _.mapValues

如果您正在检查,如果该属性如问题中所述存在于对象中,则可以使用 loash 库 已经方法

_.has(object, path)

我给你举个例子,怎么用它。

考虑一个物体

    const user = {
name : "prabhat",
age: 27,
height: "5.7"
}

如果要检查对象中是否存在 姓名属性,可以按照以下方法使用 已经方法

_.has(user, 'name') //true
_.has(user, 'address') //false

你会得到一个 boolean真/假作为回报。