根据值过滤对象属性

Posted

技术标签:

【中文标题】根据值过滤对象属性【英文标题】: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,您不应该把它放在答案中以提供更多可见性吗?谢谢! 【参考方案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)

【讨论】:

以上是关于根据值过滤对象属性的主要内容,如果未能解决你的问题,请参考以下文章

根据属性值用 lodash 过滤对象数组

JavaScript 根据属性值过滤对象数组

根据来自不同对象数组的属性和值过滤对象数组

使用嵌套对象迭代 json 并根据属性值进行过滤

使用 Django 根据用户选择的另一个对象属性的值来过滤属性的对象值

NSPredicate 根据嵌套结构中的属性过滤自定义对象