for循环中的JavaScript编程变量

时间:2018-09-20 02:24:35

标签: javascript arrays json

我正在使用具有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进行硬编码。

3 个答案:

答案 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)

  1. 根据第一个元素(存储在filtered中)为所需数据过滤数据
  2. 使用map()遍历其余数组,这将返回一个数组
  3. 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)

  1. 根据第一个元素(存储在filtered中)为所需数据过滤数据
  2. 根据索引初始化sums的{​​{1}}的持有数组
  3. 使用0遍历过滤后的数组(行)
  4. 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))