Массив Javascript в массиве - первый индекс всегда перезаписывается

1

У меня проблема с моей функцией JS. Для упрощения я хочу заполнить массив (arr1) другими массивами (arr2). В моем цикле я использую счетчик для текущей позиции в 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++;
	}
}
<button onclick="test()">Click</button>
  • 1
    Вы должны сделать новый arr2 каждый раз через цикл.
  • 1
    ... потому что arr1[0] = arr2; не делает копию arr2 .
Теги:
arrays

2 ответа

1

Вы можете попробовать использовать оператор распространения.

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

Массив является ссылочным типом, поэтому вы всегда ссылаетесь на базу, вы не помещаете ее копию в arr1, а ссылаетесь на arr2.

Вы хотите, чтобы копия arr2 была назначена на arr1.

Вы можете сделать это, создав новый Array или более современный оператор... spread

0

Как сказал Уэнди, он просто ссылается на arr2 и не создает копию.

Поэтому вам нужно

arr2=new Array();

в начале цикла.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню