簡體   English   中英

javascript優化多個reduce和map以從嵌套對象中提取數據

[英]javascript optimize multiple reduce and map to extract data from nested objects

我正在使用兩個reduce es和map從嵌套對象的數組中提取一些數據,該方法目前正在工作,但是有點難看。 如何進行優化?

 function extractSchools(schools) { let schoolData = []; if (schools) { schoolData = schools.reduce(function(parentdata, chlrn) { let childrenlist = chlrn.children; let childrendata = []; if (childrenlist) { childrendata = childrenlist.reduce(function(addrsslist, school) { return addrsslist.concat(school.address.map(i => i.school)); }, []); } return parentdata.concat(chlrn.parent, childrendata); }, []); } return { schoolData }; } const schools = [{ "parent": "Thomas Jefferson", "children": [{ "address": [{ "school": "School A" }] }, { "address": [{ "school": "School B" }] } ] }, { "parent": "Jack Chan", "children": [{ "address": [{ "school": "School C" }] }] } ]; console.log(extractSchools(schools)); 

如何優化此功能以獲得相同的結果? 使用一個reduce而不是兩個...或其他最佳方式來做到這一點。

您可以刪除if (childrenlist) {並使用前置過濾器。

function extractSchools(schools) {
  let schoolData = [];

  if (schools) {
    schoolData = schools
      .filter(data => data.children)
      .reduce((parentdata, chlrn) => {
        const childrendata = chlrn.children.reduce(
          (addrsslist, school) =>
            addrsslist.concat(school.address.map(i => i.school)),
          []
        );
        return parentdata.concat(chlrn.parent, childrendata);
      }, []);
  }

  return { schoolData };
}

const schools = [
  {
    parent: "Thomas Jefferson",
    children: [
      {
        address: [
          {
            school: "School A"
          }
        ]
      },
      {
        address: [
          {
            school: "School B"
          }
        ]
      }
    ]
  },
  {
    parent: "Jack Chan",
    children: [
      {
        address: [
          {
            school: "School C"
          }
        ]
      }
    ]
  }
];

console.log(extractSchools(schools));

嘗試此操作,結果與您期望的結果幾乎沒有什么不同,但這將是一種更通用的方式,您可以在其中找到有關學校的地址。

schools.map(p => {
    return {[p.parent]: p.children.map(c => c.address.map(add => add.school))}
})


[
  {
    "Thomas Jefferson": [
      [
        "School A"
      ],
      [
        "School B"
      ]
    ]
  },
  {
    "Jack Chan": [
      [
        "School C"
      ]
    ]
  }
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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