是否有一些优雅的方法可以使用lodash / underscore从此对象中过滤出虚假属性?类似于_.compact(array)
如何从数组中删除falsey元素
所以来自
{
propA: true,
propB: true,
propC: false,
propD: true,
}
返回
{
propA: true,
propB: true,
propD: true,
}
答案 0 :(得分:20)
你想要_.pick
,它需要一个函数作为参数,并返回一个只包含该函数返回truthy的键的对象。所以你可以这样做:
filtered = _.pick(obj, function(value, key) {return value;})
或者更简洁:
filtered = _.pick(obj, _.identity)
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);

答案 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)