如何根据给定条件从嵌套对象数组中获取数组中的值?
How to get values in an array from nested array of objects based on a given condition?
我正在使用 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 和名称列表。
所以,对于前面的对象,如果我发送子 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' }]});
之类的东西一起使用,但它 return 所有项目。我正在寻找的只是 return 嵌套部分。
您可以使用 flatMap() where its callback returns an array of filtered subs
using filter() where each filtered item is transformed using 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>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.js"></script>
按照@ryeballar 的回答,一个带有地图的较短版本
var result = _.map(data, item => ({id: item.id, name: item.name}));
我正在使用 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 和名称列表。 所以,对于前面的对象,如果我发送子 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' }]});
之类的东西一起使用,但它 return 所有项目。我正在寻找的只是 return 嵌套部分。
您可以使用 flatMap() where its callback returns an array of filtered subs
using filter() where each filtered item is transformed using 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>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.js"></script>
按照@ryeballar 的回答,一个带有地图的较短版本
var result = _.map(data, item => ({id: item.id, name: item.name}));