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

У меня проблема с моей функцией JS. Для упрощения я хочу заполнить массив (arr1) n другими массивами (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.info(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.info(elem);});
		counter++;
	}
}
<button onclick = "test()">Click</button>

Каждый раз при прохождении цикла необходимо создавать новый arr2.

Pointy 21.10.2018 20:54

... потому что arr1[0] = arr2; не копирует arr2.

Pointy 21.10.2018 20:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Значит тебе нужно

arr2=new Array();

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

Ответ принят как подходящий

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

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

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

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

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

Другие вопросы по теме