【发布时间】:2018-09-18 09:34:39
【问题描述】:
目前我有一个嵌套的 Javascript 对象数组,它有许多同名但值不同的叶节点
{
"children": [
{
"name": "Central",
"children": [
{
"name": "Cellophane `Tape",
"value": 10.528979999999999
},
{
"name": "Cellophane Tape",
"value": 10.529
},
{
"name": "File Separator",
"value": 10.529
},
{
"name": "Hard Cover File",
"value": 10.529
},
{
"name": "Highlighter",
"value": 10.529
},
{
"name": "Office Chair",
"value": 10.529
},
{
"name": "Pencil",
"value": 10.529
},
{
"name": "Tape Dispenser",
"value": 10.529
},
{
"name": "File Cabinet",
"value": 21.058
},
{
"name": "Highlighter",
"value": 21.058
},
{
"name": "Office Chair",
"value": 21.058
},
{
"name": "Pencil",
"value": 21.058
},
{
"name": "Plastic Comb Binding",
"value": 21.058
},
{
"name": "Tape Dispenser",
"value": 21.058
},
{
"name": "White Board Markers",
"value": 21.058
},
{
"name": "File Separator",
"value": 23.273360000000004
},
{
"name": "Binder",
"value": 23.2734
},
{
"name": "Cellophane Tape",
"value": 23.2734
},
{
"name": "File Separator",
"value": 23.2734
},
{
"name": "Hard Cover File",
"value": 23.2734
},
{
"name": "Highlighter",
"value": 23.2734
},
{
"name": "Plastic Comb Binding",
"value": 23.2734
},
{
"name": "Tape Dispenser",
"value": 23.2734
},
{
"name": "White Board Markers",
"value": 23.2734
},
{
"name": "Binder",
"value": 64.0017
},
{
"name": "Eraser",
"value": 64.0017
},
{
"name": "File Separator",
"value": 64.0017
},
{
"name": "Office Chair",
"value": 64.0017
},
{
"name": "Plastic Comb Binding",
"value": 64.0017
},
{
"name": "Tape Dispenser",
"value": 64.0017
},
{
"name": "Binder",
"value": 64.00174
},
{
"name": "Tape Dispenser",
"value": 64.00174
},
{
"name": "Binder",
"value": 67.2899
},
{
"name": "Highlighter",
"value": 67.2899
},
{
"name": "Office Chair",
"value": 67.2899
},
{
"name": "Plastic Comb Binding",
"value": 67.2899
},
{
"name": "Tape Dispenser",
"value": 67.2899
},
{
"name": "Cellophane Tape",
"value": 74.2509
},
{
"name": "Office Chair",
"value": 74.2509
},
{
"name": "Pencil",
"value": 74.2509
},
{
"name": "Plastic Comb Binding",
"value": 74.2509
},
{
"name": "White Board Markers",
"value": 74.2509
},
{
"name": "Cellophane Tape",
"value": 79.7194
}
]
}
]
}
因此,我想做的是遍历这个数组的所有叶子节点,然后像这样根据每个父节点聚合它,
const agregateDeep = x => {
if (Array.isArray(x.children)) {
x.children = x.children.map(deep);
return x;
} else {
return {
x: x.reduce(function (r, o) {
(r[o.name]) ? r[o.name] += o.value : r[o.name] = o.value;
return r;
})
};
}
};
类似这样,但使用 reduce 函数返回一个平面数组。如果是这样,那么如何将这个平面数组插入到我的叶节点中?
我能够检索所有叶节点并聚合它,所以我的预期输出是这样的,但我希望它根据每个父节点。
我的数据:https://api.myjson.com/bins/gki6c
预期输出:
[
{
"name": "Central",
"children": [
{
{"name" : "Cellophane Tape","value":79.7194},
{"name" : "File Separator","value":64.0017},
{"name" : "Hard Cover File","value":23.2734},
{"name" : "Highlighter", "value":67.2899},
{"name" : "Office Chair","value":74.2509},
{"name" : "Pencil","value": 74.2509},
{"name" : "Tape Dispenser","value" : 67.2899},
{"name" : "File Cabinet","value": 21.058},
{"name" : "Plastic Comb Binding","value": 74.2509},
{"name" : "White Board Markers","value": 74.2509},
{"name" : "Binder","value" : 67.2899},
{"name" : "Eraser","value": 64.0017}
}
]
}
]
【问题讨论】:
标签: javascript arrays tree