【问题标题】:JavaScript - adding up the value of childrenJavaScript - 将孩子的价值相加
【发布时间】:2016-08-16 07:38:36
【问题描述】:

我有一个 JavaScript 对象数组,如下所示:

[{
    name: "Root 1",
    countCases: 0,
    children: [
        {
            name: "Root 1.1",
            countCases: 3
        },
        {
            name: "Root 1.2",
            countCases: 1,
            children: [
                {
                    name: "Root 1.2.1",
                    countCases: 3
                },
                {
                    name: "Root 1.2.2",
                    countCases: 1
                },
                {
                    name: "Root 1.2.3",
                    countCases: 1
                }
            ]
        }
    ]
},
{
    name: "Root 2",
    countCases: 0,
    children: [
        {
            name: "Root 2.1",
            countCases: 3
        },
        {
            name: "Root 2.2",
            countCases: 0,
            children: [
                {
                    name: "Root 2.2.1",
                    countCases: 3
                },
                {
                    name: "Root 2.2.2",
                    countCases: 1
                }
            ]
        }
    ]
}]

我想将所有嵌套子项的“countCases”值相加。这些值是:

Root 1 - 9
Root 1.1 - 3
Root 1.2 - 6
Root 1.2.1 - 3
Root 1.2.2 - 1
Root 1.2.3 - 1
Root 2 - 7
Root 2.1 - 3
Root 2.2 - 4
Root 2.2.1 - 3
Root 2.2.2 - 1

所以每个父母都有他们的“countCases”,并添加了他所有孩子的“countCases”。提前感谢您的帮助。

@edit:我尝试过这样的方法,但它不起作用:

 function addCountCasesToParentFromChildren(data)
 {
    var sumCountCases = 0;
    $.each(data, function(key, value) {
       sumCountCases = value.countCases;
       if (value.children != '')
       {
          value.countCases += addCountCasesToParentFromChildren(value.children);
       }
    });

    return sumCountCases;
 }

@edit2:好的,我做到了。解决办法:

 function addCountCasesToParentFromChildren(data)
 {
    var sumCountCases = 0;
    $.each(data, function(key, value) {
       if (value.children != '')
       {
          value.countCases += addCountCasesToParentFromChildren(value.children);
       }

       sumCountCases += value.countCases;
    });

    return sumCountCases;
 }

【问题讨论】:

  • 只是递归遍历的问题。你有没有尝试过?
  • 我试过这样的事情:function addCountCasesToParentFromChildren(data) { var sumCountCases = 0; $.each(data, function(key, value) { sumCountCases = value.countCases; if (value.children != '') { value.countCases += addCountCasesToParentFromChildren(value.children); } });返回总和计数案例; }
  • 您的数组表示法不是 JavaScript(=> 在 JavaScript 中表示其他含义,数组索引从 0 开始,而不是 1)。
  • 这只是一个快速的例子
  • 那么答案不会那么快...

标签: javascript count nested children


【解决方案1】:

你可以使用这个 ES6 函数:

function aggregate(data) {
  return (data || []).reduce( (acc, obj) => {
    var childAcc = aggregate(obj.children);
    var res = {
      name: obj.name,
      sumCountCases: obj.countCases + childAcc.sum
    };
    return {
        arr: acc.arr.concat([res], childAcc.arr),
        sum: acc.sum + res.sumCountCases
    };
  }, {arr: [], sum: 0});
}

// sample data
var data = [{
    name: "Root 1",
    countCases: 0,
    children: [{
        name: "Root 1.1",
        countCases: 3
    }, {
        name: "Root 1.2",
        countCases: 1,
        children: [{
            name: "Root 1.2.1",
            countCases: 3
        }, {
            name: "Root 1.2.2",
            countCases: 1
        }, {
            name: "Root 1.2.3",
            countCases: 1
        }]
    }]
},
{
    name: "Root 2",
    countCases: 0,
    children: [{
        name: "Root 2.1",
        countCases: 3
    }, {
        name: "Root 2.2",
        countCases: 0,
        children: [{
            name: "Root 2.2.1",
            countCases: 3
        }, {
            name: "Root 2.2.2",
            countCases: 1
        }]
    }]
}];

// convert
var { arr, sum } = aggregate(data, 0);

console.log(arr);

【讨论】:

  • Array#reduce 是 ES5 :)
  • @Leo,是的。箭头函数和解构不是。
猜你喜欢
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多