145

是否可以遍历 JavaScript 对象中的属性?例如,我有一个 JavaScript 对象定义如下:

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

属性将动态添加到此对象。有没有办法让我循环并检查属性是否存在?如果是这样,怎么做?

4

9 回答 9

643

使用_.forOwn().

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

https://lodash.com/docs#forOwn

请注意forOwn检查hasOwnProperty,就像您在遍历对象的属性时通常需要做的那样。forIn不做这个检查。

于 2014-01-23T14:31:52.257 回答
43

是的,您可以,并且不需要 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

于 2014-01-23T14:30:17.633 回答
18

对于您声明的“检查属性是否存在”的愿望,您可以直接使用 Lo-Dash 的has.

var exists = _.has(myObject, propertyNameToCheck);
于 2014-01-23T14:47:16.113 回答
7

你绝对可以像 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 );

根据原始描述,这就是我的做法。

于 2019-07-25T14:30:14.687 回答
3

让我们以下面的对象为例

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*/})
于 2018-12-03T08:24:00.120 回答
1

在 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
于 2017-06-07T13:02:12.500 回答
0

了解为什么需要使用 lodash 执行此操作会很有帮助。如果您只想检查对象中是否存在键,则不需要 lodash。

myObject.options.hasOwnProperty('property');

如果您想查看一个值是否存在,您可以使用_.invert

_.invert(myObject.options)[value]
于 2015-10-02T14:42:08.060 回答
0

如果您只想循环映射属性值,请使用_.mapValues

于 2021-07-29T23:10:18.260 回答
0

如果您正在检查,如果该属性存在于问题中所述的对象中,您可以使用 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真/假作为回报。

于 2021-11-12T05:08:59.663 回答