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