javascript - 在对象内迭代数组并相应地添加属性

标签 javascript arrays object recursion

所以,我遇到了递归问题,这是数据:

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/

相关文章:

java - "Inspect Element"Java UI 工具

c++ - 如何从文本文件中提取扩展名为 .txt 的文件名?

python - 在 Python 中,要为 "if object:"覆盖什么运算符?

vb.net - .IndexOf 函数在 vb.net 中为类列表返回负数

javascript - 使用 PassportJS、SequelizeJS 和 JWT token 时,req.user 未定义

javascript - 如何降低长 bool 表达式的复杂性?

java - 将参数从方法传递到 main

javascript - 从 shell 脚本终止 Node.js 程序

javascript - 链接到 iframe 外部

javascript - 不允许的参数 : songs_attributes