繁体   English   中英

如何使用lodash过滤嵌套对象

[英]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,
        }
    }
}

在此对象中,我有两个字段keyrecordSts ,如果状态为success ,则它们not null

我想使用lodash过滤此对象,并且输出应如下所示

{
    'somename1':{
        status:'success',
        data:{
            key:'value1',
            status:'value1',
        }
    },
    'someOtherName':{
        status:'success',
        data:{
            key:'value1',
            status:'value1',
        }
    }
}

我只想删除具有nullempty0值的键。

我尝试了这个:

_.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM