有没有一种优雅的方式使用lodash/underscore从这个对象中过滤掉falsey属性?类似于_.compact(array)
从数组中删除falsey元素的方式
所以从
{
propA: true,
propB: true,
propC: false,
propD: true,
}
返回
{
propA: true,
propB: true,
propD: true,
}
有没有一种优雅的方式使用lodash/underscore从这个对象中过滤掉falsey属性?类似于_.compact(array)
从数组中删除falsey元素的方式
所以从
{
propA: true,
propB: true,
propC: false,
propD: true,
}
返回
{
propA: true,
propB: true,
propD: true,
}
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);
Lodash 4.0有_.pick
方法,它接收一个属性数组,还有_.pickBy
方法,它接收一个函数作为参数,返回一个仅包含那些函数返回真值的键的对象,这就是我们想要的,所以它将是:
filtered = _.pickBy(obj, function(value, key) {return value;})
或者,由于_.pickBy
默认将_.identity
用作其第二个参数(这本质上就是我们上面编写的内容),因此它可以简单地编写为:
或者,由于_.pickBy
默认使用_.identity
作为第二个参数(这本质上就是我们上面编写的内容),因此它可以简单地写成:
filtered = _.pickBy(obj);
在underscore和旧版本的lodash中,只有一个_.pick
函数,它既拥有_.pick
的行为,也拥有v4中的_.pickWith
的行为。所以你可以这样做:
filtered = _.pick(obj, function(value, key) {return value;})
更简洁地说:
filtered = _.pick(obj, _.identity)
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}
var object = {
propA: true,
propB: true,
propC: false,
propD: true,
};
_.pick(object, _.identity);
// →
// {
// propA: true,
// propB: true,
// propD: true
// }
pick()函数生成一个新对象,其中包括回调返回真值的属性。因此,我们可以将identity()函数用作回调,因为它只会返回每个属性值。
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)
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 active = _.keys(_.pickBy(object));
Object.keys(obj).filter((key) => obj[key])
翻译:获取对象中所有属性名,然后过滤出属性值为真的属性名。 - Dimitrije M