Рассмотрим способы преобразования многомерного массива (произвольной глубины, n-уровней) в одномерный, с удалением элементов null
или undefined
, если они будут в массиве.
Исходный массив:
const testArray = [1, 2, null, [4, undefined, [11, 10]], 6, [7, null, 0], null, 9];
Должно получиться:
[1, 2, 4, 11, 10, 6, 7, 0, 9]
Вариант 1: цикл for и рекурсия
function flattenArray(arr) {
let result = [];
for(let index = 0; index < arr.length; index++) {
const currentValue = arr[index];
if(Array.isArray(currentValue)) {
result = [...result, ...(flattenArray(currentValue))];
// для достижения аналогичного результата можно использовать метод concat
// result = result.concat(flattenArray(currentValue));
} else {
if(currentValue != null) {
result.push(currentValue);
}
}
}
return result;
}
// проверка метода
const testArray = [1, 2, null, [4, undefined, [11, 10]], 6, [7, null, 0], null, 9];
const result = flattenArray(testArray);
console.log(result); // [1, 2, 4, 11, 10, 6, 7, 0, 9]
Стоит обратить внимание, если вместо val != null
использовать строгое типизированное сравнение val !== null
, то из массива будут удалены только null
элементы и останутся undefined
.
Этот вариант, наверное, имеет право существовать, но он очень громоздкий.
Вариант 2. Метод flat()
Этот метод возвращает новый массив, в котором все элементы всех уровней исходного массива будут "подняты" на указанный в (необязательном) параметре уровень.
По умолчанию Array.prototype.flat()
выравнивает массив до первого уровня.
const testArray = [1, 2, null, [4, undefined, [11, 10]], 6, [7, null, 0], null, 9];
console.log(testArray.flat())
// результат
// [1, 2, null, 4, undefined, [11, 10], 6, 7, null, 0, null, 9]
Если глубина массива неизвестна и надо достать все уровни вложенности, можно передать Infinity
параметром глубины.
const testArray = [1, 2, null, [4, undefined, [11, 10]], 6, [7, null, 0], null, 9];
console.log(testArray.flat(Infinity))
// результат
// [1, 2, null, 4, undefined, 11, 10, 6, 7, null, 0, null, 9]
Метод flat()
позволил избавиться от написания цикла и рекурсии, но в массиве всё ещё остаются элементы с null
и undefined
. Чтобы убрать их, можно использовать метод filter()
.
const testArray = [1, 2, null, [4, undefined, [11, 10]], 6, [7, null, 0], null, 9];
const result = testArray.flat(Infinity).filter(val => val != null);
console.log(result);
// [1, 2, 4, 11, 10, 6, 7, 0, 9]
Преимущества второго варианта очевидны: одна строка кода против цикла с рекурсией.
Обратите внимание, метод flat()
не будет работать в браузере Internet Explorer.