[英]Filtering array of objects with arrays based on nested value to extract specific fields
[英]Filtering array of objects with arrays based on nested value
我正在嘗試根據一些嵌套的 object 過濾一個數組。我准備了一些Fiddle
輸入數組如下所示:
let arrayOfElements =
[
{
"name": "a",
"subElements":
[
{"surname": 1},
{"surname": 2}
]
},
{
"name": "b",
"subElements":
[
{"surname": 3},
{"surname": 1}
]
},
{
"name": "c",
"subElements":
[
{"surname": 2},
{"surname": 5}
]
}
];
對於這種情況,我希望 output 看起來像這樣:
let filteredArray =
[
{
"name": "a",
"subElements":
[
{"surname": 1}
]
},
{
"name": "b",
"subElements":
[
{"surname": 1}
]
}
];
我正在使用這個公式來做到這一點:
let filteredArray = arrayOfElements.filter((element) => element.subElements.some((subElement) => subElement.surname === 1));
Output 幾乎不錯,但它返回的對象包含所有帶有姓氏的對象(最好檢查小提琴:D),而不是將它們刪除。 我怎樣才能改進過濾?
通過這種方式,您可以在任何級別的數組中盡可能深入並過濾元素,
arrayOfElements.map((element) => {
return {...element, subElements: element.subElements.filter((subElement) => subElement.surname === 1)}
})
Spread operator
將擴大element
,然后過濾subElements
將覆蓋subElements
的元素。
調用filter
,您需要將結果通過管道傳送到map
,如下所示:
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。
let filteredArray = arrayOfElements
.filter((element) =>
element.subElements.some((subElement) => subElement.surname == 1))
.map(element => {
return Object.assign({}, element, {subElements : element.subElements.filter(subElement => subElement.surname == 1)});
});
試試這個解決方案:
data_filter = arrayOfElements.filter(function (element) {
return element.subElements.some( function (subElement) {
return subElement.surname === surname
});
});
剛剛改進了上面的答案
let elements = [ { "name": "a", "subElements": [ {"surname": 1}, {"surname": 2} ] }, { "name": "b", "subElements": [ {"surname": 3}, {"surname": 1} ] }, { "name": "c", "subElements": [ {"surname": 2}, {"surname": 5} ] } ]; var value = 1; var filteredArray = elements .filter(element => element.subElements .some(subElement => subElement.surname === value) ) .map(element => { let n = Object.assign({}, element, {'subElements': element.subElements.filter( subElement => subElement.surname === value )}) return n; }) console.log(filteredArray)
function display_message() { let arrayOfElements = [{ "name": "a", "subElements": [{ "surname": 1 }, { "surname": 2 }] }, { "name": "b", "subElements": [{ "surname": 3 }, { "surname": 1 }] }, { "name": "c", "subElements": [{ "surname": 2 }, { "surname": 5 }] }]; // console.log(arrayOfElements); var surname = 1; let filteredArray = arrayOfElements.filter((element) => element.subElements.some((subElement) => subElement.surname === surname)); for(var data in filteredArray){ filteredArray[data].subElements = {"surname": surname}; } console.log(filteredArray); }
<input type="button" onclick="display_message();" value="click"/>
您也可以使其通用:
subElements
值設置為過濾列表。 let arrayOfElements=[{name:"a",subElements:[{surname:1},{surname:2}]},{name:"b",subElements:[{surname:3},{surname:1}]},{name:"c",subElements:[{surname:2},{surname:5}]}]; let distinct_surnames = []; arrayOfElements.forEach(function(el) { el.subElements.forEach(function(s) { if (distinct_surnames.indexOf(s.surname) < 0) distinct_surnames.push(s.surname) }); }) let result = []; distinct_surnames.forEach(function(sn) { let inter = []; arrayOfElements.forEach(function(el) { let f = el.subElements.filter(function(sub) { return sub.surname === sn; }); if (f.length > 0) { let _tmp = Object.assign({}, el); _tmp.subElements = f; inter.push(_tmp); } }); result.push(inter); }) console.log(result)
注意:箭頭函數用於保持this
的引用。 如果你不使用this
內部函數,你也可以使用普通函數。
let filteredArray = arrayOfElements
.filter((element) =>
element.subElements.some((subElement) => subElement.surname === 1))
.map(element => {
let newElt = Object.assign({}, element); // copies element
newElt.subElements = newElt.subElements.filter(subElement => subElement.surName === '1');
return newElt;
});
更正確
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.