根据值过滤对象属性

Filtering object properties based on value

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

所以来自

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

返回

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

这里有两个原版 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);

参见 对象。<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys" rel="noreferrer">keys()</a> and Array.prototype.<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach" rel="noreferrer">forEach()</a>

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);

参见 对象。<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys" rel="noreferrer">keys()</a> and Array.prototype.<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce" rel="noreferrer">reduce()</a>

Lodash 4.0

Lodash 4.0 有 _.pick,它接受一个属性数组,_.pickBy 接受一个函数作为参数,returns 一个只包含该函数的键的对象returns truthy 这就是我们在这里想要的,所以它会是:

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

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

filtered = _.pickBy(obj);

Underscore 或 Lodash 4.0 之前的版本

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

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

或更简洁:

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

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

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

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

pick() function generates a new object that includes properties that the callback returns truthy for. So we can just use the identity() 函数作为回调函数,因为它只是 return 每个 属性 值。

不幸的是,我还不能直接评论上面的 post,所以我创建了这个额外的 post。

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

var filtered = _.pickBy(obj);

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

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

const active = _.keys(_.pickBy(object));
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 循环我们可以达到这样的效果。

另一种方法

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)