簡體   English   中英

在對象內部迭代數組並相應地添加屬性

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM