【问题标题】:Javascript array in array - first index is always overwritten数组中的 Javascript 数组 - 第一个索引总是被覆盖
【发布时间】:2019-01-21 01:27:10
【问题描述】:

我的 JS 函数有问题。为简化起见,我想用 n 个其他数组(arr2)填充一个数组(arr1)。在我的循环中,我对 arr1 中的当前位置使用计数器(出于某种原因,不能使用 arr1.push)。如果我将所有的 arr2 都记录在 arr1 中,它们都是相同的,总是最后一个添加的。所以我写了一个基本的脚本来测试它。我总是记录第一个元素并增加计数器。 我是 JS 新手,有什么我不明白的巨大误解吗?

function test(){
	var arr1 = [];
	var arr2 = [];
	var counter=1;
	arr2[0]="first";
	arr2[1]="first";
	arr2[2]="first";
	arr1[0]=arr2;
  arr1[0].forEach(function(elem){console.log(elem);});
	for (var i = 0; i < 10 ; i++) {
		arr2[0]=counter;
		arr2[1]=counter;
		arr2[2]=counter;
		arr1[counter]=arr2;
    
		arr1[0].forEach(function(elem){console.log(elem);});
		counter++;
	}
}
&lt;button onclick="test()"&gt;Click&lt;/button&gt;

【问题讨论】:

  • 每次循环都必须创建一个新的arr2
  • ... 因为arr1[0] = arr2; 不会复制arr2

标签: javascript arrays


【解决方案1】:

您可以尝试使用扩展运算符。

arr1[0]=[...arr2];
arr1[counter]=[...arr2];

数组是一种引用类型,所以你总是引用基数,你不会把它的副本放在 arr1 中,而是对 arr2 的引用。

您希望将 arr2 的副本分配给 arr1。

你可以通过创建一个新的数组来做到这一点,或者更现代的 ... 扩展运算符

【讨论】:

    【解决方案2】:

    正如 Pointy 所说,它只是引用了 arr2 而没有创建副本。

    所以你需要

    arr2=new Array();
    

    在循环的开头。

    【讨论】:

      猜你喜欢
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 2013-03-03
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 2021-09-12
      相关资源
      最近更新 更多