[英]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}]}
该代码仅在每次迭代中添加值并更新现有值。
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.