繁体   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