Составление таблицы умножения в виде двух массивов

В настоящее время я пытаюсь составить таблицу умножения 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]

Я не понимаю, почему первый индекс каждого массива такой же, как второй, Я хочу создать это без этого первого индекса.

Помощь и то, как вы ее решили, было бы потрясающе, большое спасибо!

Это происходит от multiplicationTable[i] = [i]. Это заполняет multiplicationTable[i][0], затем внутренний цикл добавляет индексы от 1 до 10.

Barmar 10.05.2024 21:19

Помните, что индексы массива начинаются с 0, а не с 1.

Barmar 10.05.2024 21:19

Вы можете инициализировать его как [0], поскольку это правильный результат для i * 0.

Barmar 10.05.2024 21:20

Эй, я не думаю, что понимаю. Что мне сбросить на [0] Я сделал первые индексы равными 1, потому что тогда я могу использовать их как числа для самого умножения

Dolev Levy 10.05.2024 21:22
Поведение ключевого слова "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) для оценки ваших знаний,...
0
4
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Индексы массивов начинаются с 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. Большое вам спасибо!

Dolev Levy 10.05.2024 21:44

Вот другой подход, использующий вложенные вызовы 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;}

Этот второй подход не только короче, но и более эффективен в вычислительном отношении, чем мой предыдущий.

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