2017-03-07 86 views
0

我有一个对象,它看起来像这样来筛选嵌套的对象:如何使用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,这是not null如果状态success

我想用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 

但它给一个场只值,相反,我希望该字段的名称,第二场也。请帮忙。

谢谢。

+0

循环播放对象检查属性并在需要时删除 – fubbe

回答

0

您可以使用_.pickBy与我们的定制predicate,像

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

可以使用_.omitBy删除falsy值

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

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

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

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