【问题标题】:JavaScript Programming variables in a for loopfor循环中的JavaScript编程变量
【发布时间】:2018-09-21 00:38:43
【问题描述】:

我正在使用一个包含 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。

【问题讨论】:

  • 您是在寻找所有数组中所有元素的总和,还是每个子数组的总和?
  • 您似乎正在尝试使用一个变量来保存另一个变量的名称。这是错误的想法。当您走错路时,您应该显示其余代码(包括您的命名变量)。
  • 我有一个包含许多数组的数组,我通过第一个元素过滤真实的数组以获取所有 2017 年的记录,然后每个子数组中有 38 个元素,我需要得到总和所有第二个元素,第三个元素,第四个元素......
  • 你是否将第 2+3+4 个元素加在一起(例如,arr1[1]+arr1[2]…arr1[n])得到总和?或者你是按指数求和吗? arr1[2]+arr2[2]…arrN[2]
  • @BillChappell 查看下面的答案,解决了这两种情况

标签: javascript arrays json


【解决方案1】:

按数组求和

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. 通过0的索引初始化sums的持有数组
  3. 使用forEach遍历过滤后的数组(行)
  4. forEach() 循环内,使用另一个 forEach() 迭代每个值,并使用索引和值存储到之前创建的 sums 数组中

使用解构赋值/休息忽略第一个元素。 [_,...arr] 表示第一个元素将存储在名为 _ 的变量中,其余元素将存储在名为 arr 的数组中,即元素 2..n(索引:1..n- 1).

【讨论】:

  • 您的 SUM by INDEX 正是我所需要的,您的代码看起来比我的 hack 工作干净 100%,谢谢,我学到了一些东西。
【解决方案2】:

你想做什么?如果您尝试对数组求和。

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));

【讨论】:

    【解决方案3】:

    您可以简单地使用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))

    【讨论】:

    • 我试图创建一个新数组,它的总和为数组[0][0] + 数组[1][0] + 数组[2][0]。 ,然后得到 array[0][1] + array[1][1] + array[1][2] 等的总和。这些答案让我看到了作为 GIS Web 开发人员的新地图。 .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    相关资源
    最近更新 更多