首页 > 解决方案 > 推送到二维数组中的对象

问题描述

我正在尝试将字符串推送到 Google Apps 脚本中的二维数组,但我遇到了一些我不理解的奇怪行为。产生相同行为的简化版本在这里:

function arrayTest() {
  var mainArr, subArr, i, arrLoc;
  mainArr = [];
  subArr = [];
  for (i = 0; i < 5; i++) {
    mainArr.push(subArr);
  }
  for (i = 0; i < 10; i++) {
    arrLoc = Math.floor(Math.random() * 5);
    mainArr[arrLoc].push('test');
  }
  Logger.log(mainArr);
}

我所期望的是'test'被推入数学函数生成的索引处的任何数组 - 所以如果生成的数字是 0、2、1、4、4、3、0、2、1、0 我想我将收到:

[['test', 'test', 'test'], ['test', 'test'], ['test', 'test'], ['test'], ['test', 'test']]

然而,这种情况并非如此。我收到的是这样的:

[['test', 'test', 'test', 'test', 'test', 'test', 'test', 'test', 'test', 'test'], 
 ['test', 'test', 'test', 'test', 'test', 'test', 'test', 'test', 'test', 'test'], 
 ['test', 'test', 'test', 'test', 'test', 'test', 'test', 'test', 'test', 'test'], 
 ['test', 'test', 'test', 'test', 'test', 'test', 'test', 'test', 'test', 'test'], 
 ['test', 'test', 'test', 'test', 'test', 'test', 'test', 'test', 'test', 'test']]

很明显,'test'它被推到循环mainArr的每一步中的每个位置for,而不仅仅是位于 Math 函数生成的索引处的数组。

我在这里是否遗漏了一些非常明显的东西,例如不正确的运算符,或者我误解了数组的工作原理?一些指导将不胜感激!

谢谢。

标签: javascriptarraysgoogle-apps-script

解决方案


那是因为你一遍又一遍地将同一个数组推入主数组。

function arrayTest() {
  var mainArr, subArr, i, arrLoc;
  mainArr = [];
  subArr = []; // <-- This creates an array and stores it in the variable 'subArr'
  for (i = 0; i < 5; i++) {
    mainArr.push(subArr); // <-- The very same array is pushed into mainArr over and over
  }
  ...
}

但我认为你想要的是创建多个数组并将它们mainArr单独推入,所以你的代码应该如下所示:

function arrayTest() {
  var mainArr, subArr, i, arrLoc;
  mainArr = [];
  for (i = 0; i < 5; i++) {
    subArr = []; // <-- Here you create a brand new array and stores it in 'subArr'
    mainArr.push(subArr); // <-- The newly created array is pushed into 'mainArr'
  }
  ...
}

推荐阅读