Вложенные массивы - обновление подмассивов во время вложения с циклом for не работает? - PullRequest
0 голосов
/ 18 декабря 2018
const nestedArr = [];
// ADD CODE HERE
let arr = [];
for(let i=0; i<5; i++){
  arr.push(`loop${i}`, i);
  nestedArr.push(arr);
  // nestedArr.push([`loop${i}`, i]);
}

console.log(nestedArr)

Привет, ребята, просто интересно, какое поведение JS я не понимаю.Задача решается, когда используется закомментированная строка в сером // nestedArr.push([ цикле $ {i} , i]);, но когда я пытаюсь использовать другой подход без комментариев

arr.push(`loop${i}`, i);
nestedArr.push(arr);

не работает, как я думал.

Подход заключается в том, чтобы сначала объявить массив arr и вставлять в него каждые 5 итераций строку loop${i} и индекс второго элемента i.Затем вставьте массив arr в nestedArr в течение 5 итераций.Ожидаемый результат, если arr помещается 5 раз в nestedArr, причем каждый push предположительно добавляет один элемент за раз в пределах arr.Тем не менее, как вы можете видеть, толкаемые подмассивы arr толкаются, удерживая по 5 элементов каждые 5 раз.Я ожидал, что первая итерация будет равна 0, когда массив подмассивов, помещенный в nestedArr, будет содержать только один элемент, но уже содержит 5 таких же элементов с другими подмассивами.

[['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4], ['loop0', 0, 'loop1', 1, 'loop2', 2, 'loop3', 3, 'loop4', 4]]

ожидаемый результат должен быть

[['loop0', 0], ['loop1', 1], ['loop2', 2], ['loop3', 3], ['loop4', 4]]

С каждой итерацией для добавления одного элемента за раз в подмассивном массиве, который затем передается в nestedArr в течение 5 итераций.Есть идеи, почему?

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

вы забыли правильно добавить к arr:

const nestedArr = [];
// ADD CODE HERE
let arr = [];
for(let i=0; i<5; i++){
  arr.push([`loop${i}`, i]);
  nestedArr.push(arr);
  // nestedArr.push([`loop${i}`, i]);
}

console.log(nestedArr)

посмотрите, я делаю массив перед тем, как вставить arr arr.push([ loop $ {i} , i]);

0 голосов
/ 18 декабря 2018

Массив - это объект, поэтому то, что вы помещаете в окончательный массив nestedArr , фактически содержит ссылку на подмассив ( arr в вашем случае).Теперь, когда вы помещаете данные в один и тот же подмассив arr , ссылка на них обновляется в основном массиве каждый раз, и, наконец, когда вы печатаете выходные данные, они содержат один и тот же объект несколько раз в массиве.Чтобы избежать этого, вы можете либо использовать то, что предложил @Oihane Vázquez, либо напрямую помещать данные в основной массив следующим образом:

const nestedArr = [];
for (let i = 0; i < 5; i++) {
  nestedArr.push([`loop${i}`, i]);
}

console.log(nestedArr);
0 голосов
/ 18 декабря 2018

Вы должны инициализировать массив arr каждый раз, когда цикл начинается снова:

const nestedArr = [];
for (let i = 0; i < 5; i++) {
  let arr = [];
  arr.push(`loop${i}`, i);
  nestedArr.push(arr);
}
console.log(nestedArr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...