所以,我遇到了递归问题,这是数据:
let data = {
label: "Root",
datasets: [
{
label: "Parent 1"
datasets: [
{
label: "Child 1",
dataMax: 100,
datasets: 30
},
{
label: "Child 2",
dataMax: 30,
datasets: 30
}
]
},
{
label: "Parent 2",
dataMax: 50,
datasets: 30
}
]
};
我想要做的是迭代这个,并将 dataMax
的属性和数据放入每个没有 dataMax< 的父级中
,如果父级有两个或多个子级,则 dataMax
将具有其子级的总值。
请注意,数据
的深度和长度是随机的。
这是我尝试过的:
let data = {
label: "Root",
datasets: [
{
label: "Parent 1",
datasets: [
{
label: "Child 1",
dataMax: 100,
datasets: 30
},
{
label: "Child 2",
dataMax: 30,
datasets: 30
}
]
},
{
label: "Parent 2",
dataMax: 50,
datasets: 30
}
]
};
let setDatas = function(x, i, p){
if (x == undefined) {
console.log("--- This is x==undefined ---");
return 1;
} else if (Array.isArray(x.datasets)) {
console.log("-------------- " + x.label + ", datasets[" + [i] + "]:");
console.log(x.datasets[i]);
return setDatas(x.datasets[i], i, x);
} else {
console.log("It's not an Array");
++i;
return setDatas(p, i, p);
}
}
setDatas(data, 0);
我设法到达了深处,但我似乎无法回到根源,我觉得我错过了一些东西,但似乎找不到它。我做错了什么?
所需输出:
let data = {
label: "Root",
dataMax: 180, // Total from dataMax of Parent 1 and 2
datasets: [
{
label: "Parent 1",
dataMax: 130, // Total from dataMax of "Child 1" and dataMax of "Child 2"
datasets: [
{
label: "Child 1",
dataMax: 100,
datasets: 30
},
{
label: "Child 2",
dataMax: 30,
datasets: 30
}
]
},
{
label: "Parent 2",
dataMax: 50,
datasets: 30
}
]
};
提前致谢。欢迎询问更多信息。
最佳答案
在您的实际函数中,您不会迭代 data.datasets
,您只是检查给定的 data
,您需要循环遍历嵌套的 数据.数据集
.
您可以使用 Array#map()
的组合 和 Array#reduce()
这样的方法:
function getDataMax(data) {
if (data.datasets && Array.isArray(data.datasets)) {
data.datasets = data.datasets.map(x => {
if (!x.dataMax) {
if (Array.isArray(x.datasets)) {
//If inner datasets is an array do the recursive call
getDataMax(x);
}
}
return x;
});
}
if (!data.dataMax)
data.dataMax = data.datasets.map(x => x.dataMax).reduce((a, b) => (a + b));
}
演示:
let data = {
label: "Root",
datasets: [{
label: "Parent 1",
datasets: [{
label: "Child 1",
dataMax: 100,
datasets: 30
},
{
label: "Child 2",
dataMax: 30,
datasets: 30
}
]
},
{
label: "Parent 2",
dataMax: 50,
datasets: 30
}
]
};
function getDataMax(data) {
if (data.datasets && Array.isArray(data.datasets)) {
data.datasets = data.datasets.map(x => {
if (!x.dataMax) {
if (Array.isArray(x.datasets)) {
getDataMax(x);
}
}
return x;
});
}
if (!data.dataMax)
data.dataMax = data.datasets.map(x => x.dataMax).reduce((a, b) => (a + b));
}
getDataMax(data);
console.log(data)
关于javascript - 在对象内迭代数组并相应地添加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53644073/