У меня проблема с моей функцией 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>
Вы можете попробовать использовать оператор распространения.
arr1[0]=[...arr2];
arr1[counter]=[...arr2];
Массив является ссылочным типом, поэтому вы всегда ссылаетесь на базу, вы не помещаете ее копию в arr1, а ссылаетесь на arr2.
Вы хотите, чтобы копия arr2 была назначена на arr1.
Вы можете сделать это, создав новый Array или более современный оператор... spread
Как сказал Уэнди, он просто ссылается на arr2 и не создает копию.
Поэтому вам нужно
arr2=new Array();
в начале цикла.
arr2
каждый раз через цикл.arr1[0] = arr2;
не делает копиюarr2
.