根据值过滤对象属性

use*_*395 14 javascript underscore.js lodash

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

所以

{
  propA: true,
  propB: true,
  propC: false,
  propD: true,
}
Run Code Online (Sandbox Code Playgroud)

回国

{
  propA: true,
  propB: true,
  propD: true,
}
Run Code Online (Sandbox Code Playgroud)

Ret*_*sam 24

在Lodash 4.0之前

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

filtered = _.pick(obj, function(value, key) {return value;})
Run Code Online (Sandbox Code Playgroud)

或者甚至更简洁:

filtered = _.pick(obj, _.identity)
Run Code Online (Sandbox Code Playgroud)

Lodash 4.0

Lodash 4.0将_.pick函数拆分为_.pick,它采用了一系列属性,并且_.pickBy具有一个函数.所以现在就是这样

filtered = _.pickBy(obj, function(value, key) {return value;})
Run Code Online (Sandbox Code Playgroud)

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

filtered = _.pickBy(obj);
Run Code Online (Sandbox Code Playgroud)


I a*_*ica 13

这里有两个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);
Run Code Online (Sandbox Code Playgroud)

见和Object.keys()Array.prototype.forEach()

B.:迭代对象的键并将truthy值添加到新对象.

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);
Run Code Online (Sandbox Code Playgroud)

见和Object.keys()Array.prototype.reduce()