【问题标题】:Loop through properties in JavaScript object with Lodash使用 Lodash 遍历 JavaScript 对象中的属性
【发布时间】:2014-02-14 03:57:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript lodash


    【解决方案1】:

    是的,你可以,并且不需要 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 函数样式,我的只是一种让 OP 理解你可以根据库循环一个 obj 的方式(如果他只想要那个功能 w/ o 包括 lodash)
    • 在这种情况下,提供两个答案会很好。
    • 使用lodash 而不是这只是因为不需要烦人的hasOwnProperty 检查
    【解决方案2】:

    使用_.forOwn()

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

    https://lodash.com/docs#forOwn

    请注意,forOwn 会检查 hasOwnProperty,这在循环对象的属性时通常需要这样做。 forIn 不做这个检查。

    【讨论】:

    • 非常重要的是要注意key是第二个参数,但它是有意义的
    【解决方案3】:

    如果您希望“检查属性是否存在”,您可以直接使用 Lo-Dash 的has

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

    【讨论】:

      【解决方案4】:

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

      myObject.options.hasOwnProperty('property');
      

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

      _.invert(myObject.options)[value]
      

      【讨论】:

        【解决方案5】:

        在 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
        

        【讨论】:

          【解决方案6】:

          让我们以下面的对象为例

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

          【讨论】:

            【解决方案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 );
            

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2016-12-19
                  • 2012-01-08
                  • 2018-05-02
                  相关资源
                  最近更新 更多