[英]How to filter nested object using lodash
我有一个对象,看起来像这样:
{
'somename1':{
status:'success',
data:{
key:'value1',
field2:'',
field3:'',
field4:'',
field5:'',
recordSts:'done',
}
},
'someOtherName':{
status:'success',
data:{
key:'value2',
field2:0,
field3:'',
recordSts:'progress',
field5:'',
field6:0,
}
}
}
在此对象中,我有两个字段key
和recordSts
,如果状态为success
,则它们not null
。
我想使用lodash过滤此对象,并且输出应如下所示
{
'somename1':{
status:'success',
data:{
key:'value1',
status:'value1',
}
},
'someOtherName':{
status:'success',
data:{
key:'value1',
status:'value1',
}
}
}
我只想删除具有null
或empty
或0
值的键。
我尝试了这个:
_.map(records, 'key'); //records contains my input object
但是它只给出一个字段的值,相反,我也想要该字段的名称和第二个字段的名称。 请帮忙。
谢谢。
您可以将_.pickBy
与我们的自定义predicate
,例如
_.forEach(records, function(record) {
record.data = _.pickBy(record.data, function(val) {
return !!val;
}
})
您可以使用_.omitBy
删除虚假值
let res = _.forOwn(records, o => {
o.data = _.omitBy(o.data, v => {
return !v;
});
return o;
});
您可以使用mapValues() , 分配() ,和pickBy() :
_.mapValues(
records,
r => _.assign({}, r, { data: _.pickBy(r.data) })
);
这将产生一个新的records
对象,而不会改变原始对象。 我喜欢pickBy()
是默认情况下,它只会返回带有真实值的属性。 注意我们如何不传递谓词? 之所以可行,是因为默认谓词为identity() ,该谓词仅将值用作真值测试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.