簡體   English   中英

根據嵌套值過濾具有 arrays 的對象數組

[英]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"/>

您也可以使其通用:

邏輯

  • 找到所有不同的姓氏並遍歷它們
  • 過濾每個對象以檢查姓氏是否存在。 如果是,請使用Object.assign復制對象並將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM