使用基于嵌套值的数组过滤对象数组 [英] Filtering array of objects with arrays based on nested value
问题描述
我试图根据一些嵌套对象过滤数组。我准备了一些小提琴
I am trying to filter an array, based on some nested object. I prepared some Fiddle
输入数组看起来像这样:
Input array looks like this:
let arrayOfElements =
[
{
"name": "a",
"subElements":
[
{"surname": 1},
{"surname": 2}
]
},
{
"name": "b",
"subElements":
[
{"surname": 3},
{"surname": 1}
]
},
{
"name": "c",
"subElements":
[
{"surname": 2},
{"surname": 5}
]
}
];
我希望这种情况的输出看起来像这样:
I want the output for this case, to look like this:
let filteredArray =
[
{
"name": "a",
"subElements":
[
{"surname": 1}
]
},
{
"name": "b",
"subElements":
[
{"surname": 1}
]
}
];
我使用这个公式来做到这一点:
I am using this formula to do that:
let filteredArray = arrayOfElements.filter((element) => element.subElements.some((subElement) => subElement.surname === 1));
输出几乎是好的,但它返回带有姓氏的所有对象的对象(更好地检查小提琴:D ),而不是切断它们。如何改进过滤?
Output is almost good, but it returns objects with all objects with surnames (better check that fiddle :D), instead of cutting them away. How can i improve the filtering ?
推荐答案
致电过滤器
后,你需要将结果传递给 map
,如下所示:
After you call filter
, you need to pipe the results to map
, like this:
let filteredArray = arrayOfElements
.filter((element) =>
element.subElements.some((subElement) => subElement.surname === 1))
.map(element => {
let newElt = Object.assign({}, element); // copies element
return newElt.subElements.filter(subElement => subElement.surName === '1');
});
我在这里假设您不想操纵原始数组。所以,我正在使用Object.assign。
I am assuming here that you don't want to manipulate the original array. So, I am using Object.assign.
这篇关于使用基于嵌套值的数组过滤对象数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!