javascript 优化多个reduce和map从嵌套对象中提取数据

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

我正在使用两个 reducees 和 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) { 并使用 pre-filter。

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"
      ]
    ]
  }
]