[英]Iterating Array inside an Object and add property accordingly
所以,我有一個遞歸問題,這是數據:
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
和data dataMax
,如果父級有兩個或多個子級,則dataMax
將具有其子級的dataMax
。
注意, data
的深度和長度是隨機的。
這是我嘗試過的:
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
,您需要遍歷嵌套的data.datasets
。
您可以像這樣使用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)
查看是否可行:
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 setData(data) {
if (Array.isArray(data.datasets)) {
let childMax = 0;
for (let i = 0; i < data.datasets.length; i++) {
childMax += setData(data.datasets[i]);
}
if (data.dataMax === undefined) {
data.dataMax = childMax;
}
}
return data.dataMax;
}
setData(data);
您可以使用.reduce方法來保留原始數據
const 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 } ]; const redfinedDataset = datasets.reduce( (prev, curr) => { if(curr.dataMax) { return prev.concat([curr]);} else { if(curr.datasets.length >0) { const dataMax = curr.datasets.reduce( (pds, cds) => pds += cds.dataMax, 0); const nds = Object.assign(curr, {dataMax}); return prev.concat([nds]); } } }, []); console.log(redfinedDataset);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.