是否有一些优雅的方法可以使用 lodash/下划线从该对象中过滤掉错误属性?类似于
_.compact(array)
从数组中删除错误元素
所以从
{
propA: true,
propB: true,
propC: false,
propD: true,
}
归来
{
propA: true,
propB: true,
propD: true,
}
这里有两个普通的 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.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()
Lodash 4.0 有
_.pick
,它接受一个属性数组,以及 _.pickBy
,它接受一个函数作为参数,并返回一个仅包含该函数返回 true 的键的对象,这正是我们想要的,所以它' d 是:
filtered = _.pickBy(obj, function(value, key) {return value;})
或者,由于
_.pickBy
默认使用 _.identity
作为第二个参数(这基本上就是我们上面写的),它可以写为:
filtered = _.pickBy(obj);
在下划线和旧版本的 lodash 中,只有一个
_.pick
,它具有 v4 中的 _.pick
和 _.pickWith
的行为。所以你可以这样做:
filtered = _.pick(obj, function(value, key) {return value;})
或更简洁地说:
filtered = _.pick(obj, _.identity)
正如评论中部分提到的,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}
如果你使用 lodash,我会推荐这样的东西:
var object = {
propA: true,
propB: true,
propC: false,
propD: true,
};
_.pick(object, _.identity);
// →
// {
// propA: true,
// propB: true,
// propD: true
// }
pick()函数生成一个新对象,其中包含回调返回truthy的属性。因此,我们可以使用 identity() 函数作为回调,因为它只会返回每个属性值。
从 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)