繁体   English   中英

如何使用Array.reduce()?

[英]How to use Array.reduce()?

我有如下的JSON响应:

[
{"name": "a", "data": [{"value":10,"id":1},{"value":20,"id":2}],
{"name": "b", "data": [{"value":10,"id":1},{"value":20,"id":2}],
{"name": "c", "data": [{"value":10,"id":1},{"value":20,"id":2}],
{"name": "d", "data": [{"value":10,"id":1},{"value":20,"id":2}],
{"name": "e", "data": [{"value":10,"id":1},{"value":20,"id":2}],
]

如何对每个数据元素内的每个“值”求和(按列),并得到如下结果:

[{"name": "something", "data":[{"value":50,"id":1},{"value":100,"id":2}]

如何为此使用array.reduce()或是否有其他方法来实现上述结果?

尝试以下逻辑。

var series = [{"name": "a", "data": [{"value":10,"id":1},{"value":20,"id":2}]}, ... , ....]

var resultSeries = series.reduce((acc, cur) => {
    var result = {
        name: ‘Something’,
        data: []
    };
    var dataArray = acc.data.map((el, i) => {
        var curData = cur.data[i] || {};
        var sum = (el.value || 0) + (curData.value || 0);
        return {
            value: sum
        }
    });
    result.data = dataArray ;
    return result;
})

现在resultSeries将保持

[{"name": "something", "data":[{"value":50,"id":1},{"value":100,"id":2}]

您可以将一个对象作为id哈希表并求和。

 var array = [{ name: "a", data: [{ value: 10, id: 1 }, { value: 20, id: 2 }] }, { name: "b", data: [{ value: 10, id: 1 }, { value: 20, id: 2 }] }, { name: "c", data: [{ value: 10, id: 1 }, { value: 20, id: 2 }] }, { name: "d", data: [{ value: 10, id: 1 }, { value: 20, id: 2 }] }, { name: "e", data: [{ value: 10, id: 1 }, { value: 20, id: 2 }] }], result = { name: 'something', data: Object.values(array.reduce((r, { data }) => { data.forEach(({ value, id }) => { r[id] = r[id] || { value: 0, id }; r[id].value += value; }); return r; }, Object.create(null))) }; console.log(result); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

试试这个代码

<script>
 var numbers = [
{"name": "a", "data": [{"value":10,"id":1},{"value":20,"id":2}]},
{"name": "b", "data": [{"value":10,"id":1},{"value":20,"id":2}]},
{"name": "c", "data": [{"value":10,"id":1},{"value":20,"id":2}]},
{"name": "d", "data": [{"value":10,"id":1},{"value":20,"id":2}]},
{"name": "e", "data": [{"value":10,"id":1},{"value":20,"id":2}]},
];

function getSum(total, val) {
  total.data[0].value = total.data[0].value + val.data[0].value;
  total.data[1].value = total.data[1].value + val.data[1].value;
  return total;
 }
function myFunction(item) {
   document.getElementById("demo").innerHTML = 
  JSON.stringify(numbers.reduce(getSum));
}

此打印

Sum of numbers in array: {"name":"a","data":[{"value":50,"id":1},{"value":100,"id":2}]}

该代码仅在每次迭代中添加值并更新现有值。

使用Array.reduceArray.map

 var arr =[{"name": "a", "data": [{"value":10,"id":1},{"value":20,"id":2}]},{"name": "b", "data": [{"value":10,"id":1},{"value":20,"id":2}]},{"name": "c", "data": [{"value":10,"id":1},{"value":20,"id":2}]},{"name": "d", "data": [{"value":10,"id":1},{"value":20,"id":2}]},{"name": "e", "data": [{"value":10,"id":1},{"value":20,"id":2}]}]; var result = { "name" : "something", "data" : arr.reduce((a,c) => { // reduces/merges 2 records of arr a.data.map((v, i) => { // add values for the 2 records (column wise) v.value = v.value + c.data[i].value; return v; }); return a; }) }; console.log(result); 

我相信您的JSON数据看起来像我在以下代码段中使用的那样。 您可以这样做:

  a = [ {"name": "a", "data": [{"value":10,"id":1},{"value":20,"id":2}]}, {"name": "b", "data": [{"value":10,"id":1},{"value":20,"id":2}]}, {"name": "c", "data": [{"value":10,"id":1},{"value":20,"id":2}]}, {"name": "d", "data": [{"value":10,"id":1},{"value":20,"id":2}]}, {"name": "e", "data": [{"value":10,"id":1},{"value":20,"id":2}]}, ] let reducer = (accumulator, currValue) => { accumulator.name = "something"; for (let i = 0; i < accumulator.data.length; i++) { accumulator.data[i].value += currValue.data[i].value; } return accumulator }; // This will give the result you want: console.log(a.reduce(reducer)); 

结果将是:

{"name":"something","data":[{"value":50,"id":1},{"value":100,"id":2}]}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM