根据值过滤对象属性
Filtering object properties based on value
是否有一些优雅的方法可以使用 lodash/underscore 从该对象中过滤掉错误的属性?类似于 _.compact(array)
从数组中删除虚假元素的方式
所以来自
{
propA: true,
propB: true,
propC: false,
propD: true,
}
返回
{
propA: true,
propB: true,
propD: true,
}
这里有两个原版 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);
参见 对象。<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys" rel="noreferrer">keys()</a>
and Array.prototype.<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach" rel="noreferrer">forEach()</a>
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);
参见 对象。<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys" rel="noreferrer">keys()</a>
and Array.prototype.<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce" rel="noreferrer">reduce()</a>
Lodash 4.0
Lodash 4.0 有 _.pick
,它接受一个属性数组,_.pickBy
接受一个函数作为参数,returns 一个只包含该函数的键的对象returns truthy 这就是我们在这里想要的,所以它会是:
filtered = _.pickBy(obj, function(value, key) {return value;})
或者,由于 _.pickBy
默认使用 _.identity
作为它的第二个参数,(这基本上就是我们上面写的,)它可以写成:
filtered = _.pickBy(obj);
Underscore 或 Lodash 4.0 之前的版本
在下划线和旧版本的 lodash 中,只有一个 _.pick
,它具有来自 v4 的 _.pick
和 _.pickWith
的行为。所以你可以这样做:
filtered = _.pick(obj, function(value, key) {return value;})
或更简洁:
filtered = _.pick(obj, _.identity)
如果您使用的是 lodash,我会推荐这样的东西:
var object = {
propA: true,
propB: true,
propC: false,
propD: true,
};
_.pick(object, _.identity);
// →
// {
// propA: true,
// propB: true,
// propD: true
// }
pick() function generates a new object that includes properties that the callback returns truthy for. So we can just use the identity() 函数作为回调函数,因为它只是 return 每个 属性 值。
不幸的是,我还不能直接评论上面的 post,所以我创建了这个额外的 post。
自 Lodash v4 以来,上述功能已移至 _.pickBy。使用 _.identity
作为默认设置,您还可以将代码更改为:
var filtered = _.pickBy(obj);
请参阅此 JSBin 以获取工作示例。
从 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)
是否有一些优雅的方法可以使用 lodash/underscore 从该对象中过滤掉错误的属性?类似于 _.compact(array)
从数组中删除虚假元素的方式
所以来自
{
propA: true,
propB: true,
propC: false,
propD: true,
}
返回
{
propA: true,
propB: true,
propD: true,
}
这里有两个原版 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);
参见 对象。<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys" rel="noreferrer">keys()</a>
and Array.prototype.<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach" rel="noreferrer">forEach()</a>
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);
参见 对象。<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys" rel="noreferrer">keys()</a>
and Array.prototype.<a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce" rel="noreferrer">reduce()</a>
Lodash 4.0
Lodash 4.0 有 _.pick
,它接受一个属性数组,_.pickBy
接受一个函数作为参数,returns 一个只包含该函数的键的对象returns truthy 这就是我们在这里想要的,所以它会是:
filtered = _.pickBy(obj, function(value, key) {return value;})
或者,由于 _.pickBy
默认使用 _.identity
作为它的第二个参数,(这基本上就是我们上面写的,)它可以写成:
filtered = _.pickBy(obj);
Underscore 或 Lodash 4.0 之前的版本
在下划线和旧版本的 lodash 中,只有一个 _.pick
,它具有来自 v4 的 _.pick
和 _.pickWith
的行为。所以你可以这样做:
filtered = _.pick(obj, function(value, key) {return value;})
或更简洁:
filtered = _.pick(obj, _.identity)
如果您使用的是 lodash,我会推荐这样的东西:
var object = {
propA: true,
propB: true,
propC: false,
propD: true,
};
_.pick(object, _.identity);
// →
// {
// propA: true,
// propB: true,
// propD: true
// }
pick() function generates a new object that includes properties that the callback returns truthy for. So we can just use the identity() 函数作为回调函数,因为它只是 return 每个 属性 值。
不幸的是,我还不能直接评论上面的 post,所以我创建了这个额外的 post。
自 Lodash v4 以来,上述功能已移至 _.pickBy。使用 _.identity
作为默认设置,您还可以将代码更改为:
var filtered = _.pickBy(obj);
请参阅此 JSBin 以获取工作示例。
从 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)