根据值过滤对象属性

时间:2015-03-26 15:18:29

标签: javascript underscore.js lodash

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

所以来自

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

返回

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

7 个答案:

答案 0 :(得分:20)

在Lodash 4.0之前

你想要_.pick,它需要一个函数作为参数,并返回一个只包含该函数返回truthy的键的对象。所以你可以这样做:

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

或者更简洁:

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

Lodash 4.0

Lodash 4.0将_.pick函数拆分为_.pick,其中包含一系列属性,而_.pickBy则包含一个函数。所以现在它是

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

或者,由于_.pickBy默认使用_.identity作为第二个参数,因此它可以写成:

filtered = _.pickBy(obj);

答案 1 :(得分:9)

以下是两个vanilla javascript选项:

A。:迭代对象的密钥和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.keys()Array.prototype.forEach()

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.keys()Array.prototype.reduce()

答案 2 :(得分:1)

如果您使用的是lodash,我建议使用以下内容:

var object = {
    propA: true,
    propB: true,
    propC: false,
    propD: true,
};

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

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

答案 3 :(得分:1)

很遗憾,我无法直接评论上述帖子,所以我创建了这个额外的帖子。

自Lodash v4以来,上述功能已移至_.pickBy。如果默认为_.identity,您还可以将代码更改为:

var filtered = _.pickBy(obj);

有关工作示例,请参阅此JSBin

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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循环,我们可以实现以下目标。

答案 6 :(得分:0)

另一种方法

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)