我正在使用具有38个字段的JSON数组,我必须对每个字段求和。
我尝试了一个小样本集来测试运行方式,但遇到了问题:
我有一个名为field1,field2,...的变量。所以我想出了如何创建它们,但看起来将变量视为文本而不是其内部值。
test1 = [[36,1500,2,3,4],[36,15,2,7,8],[36,3000,4,5,6],[36,8,7,6,15]]
for (var i = 0; i < test1.length; i++) { //get each array
for (var n = 0; n < 5; n++) { //get each item in the array
var theField = "field" + n;
theField = theField +test1[i][n]; //This fails
field2 = field2 + test1[i][2]; //This works
如果我使用field + n创建变量,则末尾的总和为0,
如果我在循环结束时调用field2 = field2 + test1 [i] [2],则我将获得每个数组中第三个值的总和。但是我必须对field1-> field38进行硬编码。
答案 0 :(得分:0)
您想做什么?如果您要对数组求和。
const test1 = [[36,1500,2,3,4],[36,15,2,7,8],[36,3000,4,5,6],[36,8,7,6,15]];
const sum = arr => arr.reduce((total, item) => total + item, 0);
console.log(test1.reduce((total, arr) => sum(arr) + total, 0));
答案 1 :(得分:0)
let data = [
[36, 1500, 2, 3, 4],
[36, 15, 2, 7, 8],
[99, 99, 99, 99 ,99], // fake data
[36, 3000, 4, 5, 6],
[36, 8, 7, 6, 15]
]
// only pull records with 36 as value of first element
let filtered = data.filter(arr=>arr[0]==36)
// iterate over each array and sum elements at index 1...end
let sum = filtered.map(([_,...arr]) => arr.reduce((sum, val) => sum += +val, 0))
console.log(sum)
filtered
中)为所需数据过滤数据map()
遍历其余数组,这将返回一个数组map()
循环内,使用reduce()
遍历每个值以求和数组的每个元素使用解构分配/休息忽略第一个元素。 [_,...arr]
表示第一个元素将存储在名为_
的变量中,其余元素将存储在名为arr
的数组中,该数组即元素2..5(索引:1..4)。
let data = [
[36, 1500, 2, 3, 4],
[36, 15, 2, 7, 8],
[99, 99, 99, 99, 99], // fake data
[36, 3000, 4, 5, 6],
[36, 8, 7, 6, 15]
]
// only pull records with 36 as value of first element
let filtered = data.filter(arr => arr[0] == 36)
// initialize array to hold sums
let sums = Array(filtered[0].length).fill(0)
// iterate over each array and each index to sum value at the index
filtered.forEach(([_, ...arr]) =>
arr.forEach((val, ndx) =>
sums[ndx] += +val
)
)
console.log(sums)
filtered
中)为所需数据过滤数据sums
的{{1}}的持有数组0
遍历过滤后的数组(行)forEach
循环内,使用另一个forEach()
遍历每个值,并使用索引和值存储到先前创建的forEach()
数组中使用解构分配/休息忽略第一个元素。 sums
表示第一个元素将存储在名为[_,...arr]
的变量中,其余元素将存储在名为_
的数组中,该数组即元素2..n(索引:1..n-1)。
答案 2 :(得分:0)
您可以简单地使用map使用reduce来创建子数组的和,从而将数组映射到新的和数组。这将给出一个总和数组,如果您想要这些总和,则可以对该结果再次使用reduce并获得最终数。
// Our starting data
let test1 = [[36,1500,2,3,4],[36,15,2,7,8],[36,3000,4,5,6],[36,8,7,6,15]]
// a simple reusable sum function
const sum = (sum, val) => sum + val
// Sum each array
let result = test1.map(arr => arr.reduce(sum, 0))
// Display the results (stringified for readability)
console.log('Each array sumed:', JSON.stringify(result))
// Sum the results if needed
console.log('Sum of all arrays:', result.reduce(sum, 0))