【问题标题】:Filtering object properties based on value根据值过滤对象属性
【发布时间】:2015-05-30 16:40:00
【问题描述】:

有没有一些优雅的方法可以用 lodash/underscore 过滤掉这个对象的虚假属性?类似于 _.compact(array) 如何从数组中删除虚假元素

所以从

{
  propA: true,
  propB: true,
  propC: false,
  propD: true,
}

返回

{
  propA: true,
  propB: true,
  propD: true,
}

【问题讨论】:

  • ES6 语法: Object.keys(obj).filter((key) => obj[key])
  • @DimitrijeM 将返回一个键数组,而不是一个对象。
  • 嘿@DimitrijeM,+1,您不应该把它放在答案中以提供更多可见性吗?谢谢!

标签: javascript underscore.js lodash


【解决方案1】:

Lodash 4.0

Lodash 4.0 有_.pick,它接受一个属性数组,和_.pickBy,它接受一个函数作为参数并返回一个只包含该函数返回真值的键的对象,这正是我们想要的,所以应该是:

filtered = _.pickBy(obj, function(value, key) {return value;})

或者,由于_.pickBy 默认使用_.identity 作为它的第二个参数,(这基本上就是我们上面所写的),它可以写成:

filtered = _.pickBy(obj);

下划线或 Lodash 4.0 之前的版本

在下划线和旧版本的 lodash 中,只有一个 _.pick,它同时具有 v4 中的 _.pick_.pickWith 两种行为。所以你可以这样做:

filtered = _.pick(obj, function(value, key) {return value;})

或者更简洁:

filtered = _.pick(obj, _.identity)

【讨论】:

    【解决方案2】:

    这里有两个 vanilla javascript 选项:

    答:遍历对象的键和 delete 那些具有错误值的键。

    var obj = {
      propA: true,
      propB: true,
      propC: false,
      propD: true,
    };
    
    Object.keys(obj).forEach(key => {
      if (!obj[key]) delete obj[key];
    });
    
    console.log(obj);

    Object.@987654322@Array.prototype.@987654323@

    B.:遍历对象的键并将真实值添加到新对象。

    var obj = {
      propA: true,
      propB: true,
      propC: false,
      propD: true,
    };
    
    var filteredObj = Object.keys(obj).reduce((p, c) => {    
      if (obj[c]) p[c] = obj[c];
      return p;
    }, {});
    
    console.log(filteredObj);

    Object.@987654324@Array.prototype.@987654325@

    【讨论】:

      【解决方案3】:

      很遗憾,我还不能直接评论上面的帖子,所以我创建了这个额外的帖子。

      自 Lodash v4 起,上述功能已移至 _.pickBy。使用_.identity 作为默认值,您还可以将代码更改为:

      var filtered = _.pickBy(obj);
      

      请参阅此JSBin 以获取工作示例。

      【讨论】:

        【解决方案4】:

        如果你使用 lodash,我会推荐这样的东西:

        var object = {
            propA: true,
            propB: true,
            propC: false,
            propD: true,
        };
        
        _.pick(object, _.identity);
        // →
        // {
        //   propA: true,
        //   propB: true,
        //   propD: true
        // }
        

        pick() 函数生成一个新对象,其中包含回调返回truthy 的属性。所以我们可以只使用identity() 函数作为回调,因为它只会返回每个属性值。

        【讨论】:

          【解决方案5】:

          从 lodash 4 开始,我们可以使用 pickBy() 只获取等于 true 的值。

          const active = _.keys(_.pickBy(object));
          

          【讨论】:

            【解决方案6】:
            let temp = {
              propA: true,
              propB: true,
              propC: false,
              propD: true,
            }
            
            let obj = {}
            for(x in temp){
               if(temp[x] == true){
                 obj[x] = temp[x]
               }
            }
            
            console.log(obj)
            

            使用 for-in 循环我们可以像这样实现它。

            【讨论】:

            • 该问题专门询问如何使用 lodash 或下划线来执行此操作。这也是一个已有五年历史的问题,其答案已被接受,这意味着添加的任何新答案都应指出他们所解决问题的新方面。
            【解决方案7】:

            另一种方法

            const objFilter = (obj, condition) => {
                let newObj = {}
                for (const [key, value] of Object.entries(obj)) {
                    if (condition(value)) {
                        newObj = { ...newObj, [key]: value }
                    }
                }
                return newObj
            }
            

            这样开火:

            const newData = objFilter(oldData, (value) => value.marked === false)
            

            【讨论】:

              猜你喜欢
              • 2018-04-07
              • 1970-01-01
              • 2017-03-19
              • 2018-12-25
              • 2016-05-12
              • 1970-01-01
              • 1970-01-01
              • 2018-07-06
              • 2023-03-12
              相关资源
              最近更新 更多