[英]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.