如何根据给定条件从嵌套的对象数组中获取数组中的值?

时间:2016-05-19 09:49:27

标签: lodash

我正在使用 lodash ,我有以下对象数组:

[{
    "id": 1,
    "values": [
        {
            "sub": "fr",
            "name": "foobar1"
        }, 
        {
            "sub": "en",
            "name": "foobar2"
        }
    ]
}, 
{
    "id": 2,
    "values": [
        {
            "sub": "fr",
            "name": "foobar3"
        },
        {
            "sub": "en",
             "name": "foobar4"
        }
    ]
}]

我正在尝试获取给定“SUB”的ID和名称列表。 所以,对于前一个对象,如果我发送sub fr 我想得到:

[{
    "id": 1,
    "name": "foobar1"

}, 
{
    "id": 2,
    "name": "foobar3"
}]

你知道我是否可以轻松地用lodash做到这一点?

我尝试使用_.pick但它不起作用(我对嵌套对象和数组之间的这些混合感到有点迷失)_.map(data, function (o) { _.pick(o, ['id', 'values.name']) });

我还尝试将_.filter用于_.filter(data, { values: [{ sub: 'fr' }]});之类的内容,但它会返回所有项目。我正在寻找的只是返回嵌套部分。

2 个答案:

答案 0 :(得分:9)

您可以使用flatMap()在其回调中使用filter()返回已过滤的subs数组,其中每个过滤的项目都使用map()进行转换。

var result =  _.flatMap(data, item => 
  _(item.values)
    .filter({ sub: 'fr' })
    .map(v => ({id: item.id, name: v.name}))
    .value()
);



var data = [{
    "id": 1,
    "values": [
        {
            "sub": "fr",
            "name": "foobar1"
        }, 
        {
            "sub": "en",
            "name": "foobar2"
        }
    ]
}, 
{
    "id": 2,
    "values": [
        {
            "sub": "fr",
            "name": "foobar3"
        },
        {
            "sub": "en",
             "name": "foobar4"
        }
    ]
}];

var result =  _.flatMap(data, item => 
  _(item.values)
    .filter({ sub: 'fr' })
    .map(v => ({id: item.id, name: v.name}))
    .value()
);
           
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:4)

关注@ ryeballar的回答,一个带地图的简短版本

var result =  _.map(data, item => ({id: item.id, name: item.name}));