【问题标题】:How to loop OVER several arrays如何循环多个数组
【发布时间】:2019-06-13 03:15:56
【问题描述】:

我有 n 个数组。它们每个中的行数相同:Array0、Array1、...、Arrayn。

现在我想遍历所有这些并最终加入它们。将每个 Array 转置为新创建的 ResultArray 的一列

for (var ID = 0; ID < n+1; ID++) {
    for (var i = 0; i < ("Array" + ID).length; i++) {
      ResultArray[i][ID] = ("Array" + ID)[i]
        }
  }

这是我想要的示例:

Array0 = [Apple, Banana, Chicken]
Array1 = [5, 7, 8]
Array2 = [High, Low, Low]
ResultArray = [[Apple, 5, High], [Banana, 7, Low], [Chicken, 8, Low]]

【问题讨论】:

    标签: arrays google-apps-script


    【解决方案1】:
    • 你有以下数组。

          Array0 = ["Apple", "Banana", "Chicken"];
          Array1 = [5, 7, 8];
          Array2 = ["High", "Low", "Low"];
      
    • 你想把上面的数组转换成下面的数组。

          [["Apple",5,"High"],["Banana",7,"Low"],["Chicken",8,"Low"]]
      
    • 从您的示例数组中,每个数组的数组长度相同。

    如果我的理解是正确的,那么这个修改呢?请认为这只是几个答案之一。

    修改脚本一:

    var Array0 = ["Apple", "Banana", "Chicken"];
    var Array1 = [5, 7, 8];
    var Array2 = ["High", "Low", "Low"];
    
    var arrays = [Array0, Array1, Array2]; // Please prepare this.
    
    var res = [];
    for (var i = 0; i < arrays[0].length; i++) {
      var temp = [];
      for (var j = 0; j < arrays.length; j++) {
        var ar = arrays[j];
        temp.push(ar[i]);
      }
      res.push(temp);
    }
    Logger.log(res)
    

    修改脚本2:

    var Array0 = ["Apple", "Banana", "Chicken"];
    var Array1 = [5, 7, 8];
    var Array2 = ["High", "Low", "Low"];
    
    var numberOfArrays = 3; // Please prepare this. In your case, it's 3.
    
    var res = [];
    for (var i = 0; i < Array0.length; i++) {
      var temp = [];
      for (var j = 0; j < numberOfArrays; j++) {
        var ar = eval("Array" + j);
        temp.push(ar[i]);
      }
      res.push(temp);
    }
    Logger.log(res)
    

    注意:

    • 请根据您的情况选择上述脚本之一。

    如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

    【讨论】:

    • 太棒了! :) 使用了“修改后的脚本 1”,效果很好!
    • @Kibou 感谢您的回复。很高兴您的问题得到解决。
    【解决方案2】:

    您还可以使用Array.reduce 以更简洁的方式解决此问题:

    const arr1 = ["Apple", "Banana", "Chicken"], arr2 = [5, 7, 8], arr3 = ["High", "Low", "Low"],
          data = [arr1, arr2, arr3]
    
    let result = data.reduce((acc, c) => 
     (c.forEach((x,k) => acc[k].push(x)), acc), Array.from({length: data.length}, () => []))
    
    console.log(result)

    或者以更易读的形式:

    const arr1 = ["Apple", "Banana", "Chicken"], arr2 = [5, 7, 8], arr3 = ["High", "Low", "Low"],
          data = [arr1, arr2, arr3]
    
    let result = data.reduce((acc, c) => {
      c.forEach((x,i) => acc[i].push(x))
      return acc
    }, Array.from({length: data.length}, () => []))
    
    console.log(result)

    我们的想法是merge 这些数组,然后执行Array.reduce,其中accumulator 已经采用[[],[],[]] 的形式,因此我们只需填充每个子数组。

    【讨论】:

      【解决方案3】:

      使用Array.reduce() 查找最长的数组。使用Array.map() 迭代最长的数组,得到行索引。然后使用第二个Array.map() 从数组中获取行项。

      const zip = (...arrs) => arrs
        .reduce((r, c) => c.length > r.length ? c : r, []) // get the longest array
        .map((_, i) => arrs.map(a => a[i])) // map the longest array to get the current row number, then create the row
      
      const arr1 = ["Apple", "Banana", "Chicken"], arr2 = [5, 7, 8], arr3 = ["High", "Low", "Low"]
      
      const result = zip(arr1, arr2, arr3)
      
      console.log(result)

      【讨论】:

        猜你喜欢
        • 2010-10-24
        • 1970-01-01
        • 1970-01-01
        • 2017-06-10
        • 2011-08-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多