Мне нужно написать программу, которая создает массив 2d в переменных «числа» в строках (5) и столбцах (4). Элементы массива должны быть последовательными целыми числами, начиная с 1 и заканчивая 20. Я должен использовать цикл for.
[ 1, 2, 3, 4 ],
[ 5, 6, 7, 8 ],
[ 9, 10, 11, 12 ],
[ 13, 14, 15, 16 ],
[ 17, 18, 19, 20 ],
Итак, я придумал это:
const numbers = [];
const columns = 4;
const rows = 5;
for (let i = 0; i < rows; i++) {
numbers [i] = [];
for (let j = 0; j < columns; j++){
numbers [i][j] = j + 1;
}
}
console.info(numbers);
Но результатом этого являются пять одинаковых строк, например:
[ 1, 2, 3, 4 ],
[ 1, 2, 3, 4 ],
[ 1, 2, 3, 4 ],
[ 1, 2, 3, 4 ],
[ 1, 2, 3, 4 ]
У вас есть идеи, как это исправить? Как сделать второй ряд, начиная с 5?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Похоже, во втором цикле вы должны сделать numbers [i][j] = j * i; вместо этого
Каждый раз, когда внешний цикл for начинает новую итерацию, j сбрасывается обратно на 0, поэтому вы продолжаете получать строки, начинающиеся с 1.
Чтобы исправить это, вы можете объявить переменную вне цикла for, которая отслеживает текущее число, и использовать ее вместо j следующим образом:
const numbers = [];
const columns = 4;
const rows = 5;
let currNum = 0;
for (let i = 0; i < rows; i++) {
numbers [i] = [];
for (let j = 0; j < columns; j++){
currNum++;
numbers [i][j] = currNum;
}
}
console.info(numbers);
Это интересное решение, оно работает как надо. В конце концов, я выбрал метод, предложенный @JoeyCarlisle;)
Безусловно, гораздо лучшее решение!
Вот немного обновленного кода. Вам нужно добавить i*columns к каждому значению
const numbers = [];
const columns = 4;
const rows = 5;
for (let i = 0; i < rows; i++) {
numbers[i] = [];
for (let j = 0; j < columns; j++){
numbers[i][j] = j + 1 + (i*columns);
}
}
console.info(numbers); Да, вот оно! Спасибо за решение моей проблемы. Это ценный урок для меня ;)
Это была одна из моих первых идей по исправлению, но, к сожалению, она дала мне странный результат.