根据值过滤对象属性

问题描述 投票:0回答:8

是否有一些优雅的方法可以使用 lodash/下划线从该对象中过滤掉错误属性?类似于

_.compact(array)
从数组中删除错误元素

所以从

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

归来

{
  propA: true,
  propB: true,
  propD: true,
}
javascript underscore.js lodash
8个回答
34
投票

这里有两个普通的 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()


31
投票

洛达什4.0

Lodash 4.0 有

_.pick
,它接受一个属性数组,以及
_.pickBy
,它接受一个函数作为参数,并返回一个仅包含该函数返回 true 的键的对象,这正是我们想要的,所以它' d 是:

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

或者,由于

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

filtered = _.pickBy(obj);

4.0 版本之前的下划线或 Lodash

在下划线和旧版本的 lodash 中,只有一个

_.pick
,它具有 v4 中的
_.pick
_.pickWith
的行为。所以你可以这样做:

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

或更简洁地说:

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

3
投票

正如评论中部分提到的,ES6 提供了 Object.entries() 并在 2019 年提供了 Object.fromEntries()

允许:

Object.fromEntries(Object.entries(obj).filter(([key, value]) => ...))

例如:

const obj = {
  a: 12,
  b: 123,
};

const filteredObj = Object.fromEntries(
  Object.entries(obj).filter(
    ([_, value]) => value > 100
  )
);

console.log(filteredObj);
// {b: 123}

2
投票

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

自 Lodash v4 起,上述功能已移至 _.pickBy。使用

_.identity
作为默认值,您还可以将代码更改为:

var filtered = _.pickBy(obj);

请参阅此 JSBin 了解工作示例。


1
投票

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

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

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

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


0
投票

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

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

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 循环我们可以实现这样的效果。


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)
© www.soinside.com 2019 - 2024. All rights reserved.