【问题标题】:How to filter nested object using lodash如何使用 lodash 过滤嵌套对象
【发布时间】:2017-03-07 11:52:16
【问题描述】:

我有一个对象,看起来像这样:

{
    '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

但它只给出一个字段的值,相反,我想要字段的名称和第二个字段。请帮忙。

谢谢。

【问题讨论】:

标签: javascript arrays object lodash


【解决方案1】:

您可以将_.pickBy 与我们自定义的predicate 一起使用,比如

_.forEach(records, function(record) {
  record.data = _.pickBy(record.data, function(val) {
      return !!val;
    }
  })

【讨论】:

    【解决方案2】:

    您可以使用_.omitBy 删除虚假值

    let res = _.forOwn(records, o => {
        o.data = _.omitBy(o.data, v => {
        return !v;
      });
        return o;
    });
    

    【讨论】:

      【解决方案3】:

      您可以使用mapValues()assign()pickBy()

      _.mapValues(
        records, 
        r => _.assign({}, r, { data: _.pickBy(r.data) })
      );
      

      这会产生一个新的records 对象,而不会改变原始对象。我喜欢pickBy() 的地方在于,默认情况下,它只会返回具有 truthy 值的属性。注意我们如何不传递谓词?这是因为默认谓词是identity(),它只是将值用作真值测试。

      【讨论】:

        猜你喜欢
        • 2013-06-10
        • 2016-03-23
        • 2019-02-11
        • 2017-02-19
        • 1970-01-01
        • 1970-01-01
        • 2017-06-12
        • 1970-01-01
        • 2017-09-01
        相关资源
        最近更新 更多