menumenu_open <!— xhtml.ru —>

Приведение многомерного массива к одномерному

Рассмотрим способы преобразования многомерного массива (произвольной глубины, 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.