Функция, которая создает массив с вложенными элементами

#javascript #arrays #for-loop #foreach

#javascript #массивы #for-цикл #foreach

Вопрос:

У меня есть функция, которая создает массив подмассивов. Требуется три параметра: количество подмассивов, которые необходимо создать в массиве ( numSub ), количество раз, когда желаемое значение встречается в каждом подмассиве ( numValue ), и желаемое значение ( value ).

Например, если бы я должен был вызвать функцию с помощью (3, 2, test) , я бы хотел получить следующий результат:

 Array [Array ["test", "test"], Array ["test", "test"], Array ["test", "test"]]
  

Вот функция, которую я написал:

 function subarrs(numSub, numValue, value) {
  let arr = [];
  for (let i = 0; i < numSub; i  ) {
    arr.push([]);
  }
  arr.forEach(function(sub) {
    sub.fill(value, 0, numValue - 1);
  });
  return arr;
}

console.log(subarrs(3, 2, 'test'));  

Я перебирал numSub переменную и вставлял массив в arr для каждой итерации. Это было успешно. ( Array [Array [], Array [], Array []] )

Затем я использую forEach цикл для заполнения каждого подмассива, value начинающегося с индекса 0 и заканчивающегося на индексе numValue - 1 (потому что второе вхождение значения фактически будет с индексом 1.)

Однако функция работает не так, как предполагалось. Вместо вышеупомянутого желаемого результата я получаю это:

 Array [Array [], Array [], Array []]
  

Ответ №1:

Вы можете использовать fill для массива, который получил нужную длину, например Array(numValue).fill(numValue) . Вот как вы могли бы это сделать:

 function subarrs(numSub, numValue, value) {
  return Array.from({length: numSub}, () => Array(numValue).fill(value));
}

console.log(subarrs(3, 2, 'test'));  

Ответ №2:

Вы заполняете пустой массив. Это все еще пустой массив (нечего заполнять).

Вы должны создать массив некоторой длины:

 arr.push(new Array(numValue));
  

Завершить:

 function subarrs(numSub, numValue, value) {
  let arr = [];
  for (let i = 0; i < numSub; i  ) {
    arr.push(new Array(numValue));
  }
  arr.forEach(function(sub) {
    sub.fill(value);
  });
  return arr;
}

console.log(subarrs(3, 2, 'test'));
  

Ответ №3:

Array.fill() изменяет только значения массива. Он не добавляет новые. Вместо этого снова используйте push

 function subarrs(numSub, numValue, value) {
  let arr = [];
  for (let i = 0; i < numSub; i  ) {
    arr.push([]);
  }
  arr.forEach(function(sub) {
      for (let j = 0; j < numValue; j  ) {
         sub.push(value);
      }
  });
  return arr;
}

console.log(subarrs(3, 2, 'test'));  

Ответ №4:

Вместо этого вы можете использовать .push метод для добавления значения в свой массив .fill , смотрите рабочую демонстрацию :

 function subarrs(numSub, numValue, value) {
  let arr = [];
  for (let i = 0; i < numSub; i  ) {
    arr.push([]);
    for (let j = 0; j < numValue; j  ) {
      arr[i].push(value);
    }
  }
  
  return arr;
}

console.log(subarrs(3, 2, 'test'));  

Ответ №5:

fill будет работать только с уже существующими индексами, и ее вторым параметром в вашем случае должен быть length параметр массива (который является значением по умолчанию), а не length - 1 . Вы можете увидеть это здесь:

 let myEmptyArray = [];
let myFullArray = [1, 2, 3, 4];

myEmptyArray.fill(0, 0, 4);
myFullArray.fill(0, 0, 4);

console.log(myEmptyArray, myFullArray)  

Вы могли бы push создать массив с уже установленными необходимыми ячейками с помощью new Array(numValue) . Что-то вроде этого:

 function subarrs(numSub, numValue, value) {
  let arr = [];
  for (let i = 0; i < numSub; i  ) {
    arr.push(new Array(numValue));
  }
  arr.forEach(function(sub) {
    sub.fill(value);
  });
  return arr;
}

console.log(subarrs(3, 2, 'test'));  

Ответ №6:

Если у вас есть es2015 , вы можете сделать это легко :

 const subarrs = (length, subLength, value) => 
    [...Array(length)].map(() => [...Array(subLength)].fill(value));

subarrs(3, 2, 'test');
  

(Отредактировано) после первого комментария

Комментарии:

1. Спасибо @trincot за комментарий! Я исправил, это должно работать так, как ожидалось