В настоящее время я пытаюсь составить таблицу умножения 10 с двумя вложенными циклами for. Это работает, но первые индексы работают не так, как предполагалось:
мой код:
var multiplicationTable = []
for (var i = 1; i <= 10; i++) {
multiplicationTable[i] = [i]
for (var j = 1; j <= 10; j++) {
multiplicationTable[i][j] = i*j
}
}
результат:
[1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[2, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
[3, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30]
[4, 4, 8, 12, 16, 20, 24, 28, 32, 36, 40]
[5, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50]
[6, 6, 12, 18, 24, 30, 36, 42, 48, 54, 60]
[7, 7, 14, 21, 28, 35, 42, 49, 56, 63, 70]
[8, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80]
[9, 9, 18, 27, 36, 45, 54, 63, 72, 81, 90]
[10, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
Я не понимаю, почему первый индекс каждого массива такой же, как второй, Я хочу создать это без этого первого индекса.
Помощь и то, как вы ее решили, было бы потрясающе, большое спасибо!
Помните, что индексы массива начинаются с 0, а не с 1.
Вы можете инициализировать его как [0], поскольку это правильный результат для i * 0.
Эй, я не думаю, что понимаю. Что мне сбросить на [0] Я сделал первые индексы равными 1, потому что тогда я могу использовать их как числа для самого умножения



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


Индексы массивов начинаются с 0. Итак, вычтите 1 из i и j, чтобы получить соответствующие индексы массива.
var multiplicationTable = []
for (var i = 1; i <= 10; i++) {
multiplicationTable[i-1] = []
for (var j = 1; j <= 10; j++) {
multiplicationTable[i-1][j-1] = i * j
}
}
console.info(multiplicationTable);Теперь я понимаю! Мне нужно получить доступ к таблице с индексами 0, но я все равно использую исходное умножение с текущими i и j. Большое вам спасибо!
Вот другой подход, использующий вложенные вызовы Array.map() к индексным массивам, созданным служебной функцией indArr(n):
// create the utility function indArr:
const indArr=n=>Array(n).fill(0).map((_,i)=>i),
n=20,
res=
indArr(n).map(i=>
indArr(n).map(j=>
(i+1)*(j+1)
));
console.info(JSON.stringify(res));.as-console-wrapper {max-height: 100% !important;}fill(0) необходим, поскольку .map() не будет перебирать элементы массива undefined.
Обновление:
Применяя принцип DRY («не повторяйтесь»), я могу сделать то же самое, но еще короче. Поскольку вложенные вызовы карты выполняются над одним и тем же (неизменным) массивом последовательных чисел, я мог бы также определить этот массив как константу (n20) и применить к нему вложенные вызовы .map().
// create an array of sequential numbers:
const
n20=Array(20).fill(0).map((_,i)=>i+1),
res=n20.map(i=>n20.map(j=>i*j));
console.info(JSON.stringify(res));.as-console-wrapper {max-height: 100% !important;}Этот второй подход не только короче, но и более эффективен в вычислительном отношении, чем мой предыдущий.
Это происходит от
multiplicationTable[i] = [i]. Это заполняетmultiplicationTable[i][0], затем внутренний цикл добавляет индексы от 1 до 10.