#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 за комментарий! Я исправил, это должно работать так, как ожидалось