Функция, которая создает массив с подзадачами - PullRequest
0 голосов
/ 06 марта 2019

У меня есть функция, которая создает массив подмассивов. Он принимает три параметра: количество подзадач, создаваемых в массиве (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 []]

Ответы [ 6 ]

2 голосов
/ 06 марта 2019

Вы можете использовать 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'));
1 голос
/ 06 марта 2019

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

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

subarrs(3, 2, 'test');

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

1 голос
/ 06 марта 2019

Вы можете использовать метод .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'));
1 голос
/ 06 марта 2019

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'));
1 голос
/ 06 марта 2019

Array.fill() только изменяет значения массива.Это не добавляет новые.Используйте толчок снова вместо

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'));
1 голос
/ 06 марта 2019

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

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

arr.push(new Array(numValue));

Complete:

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'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...