JavaScript | Как узнать глубину каждого элемента массива?

Есть массив:

var massiv = [11, [22], [[33]], [[[44]]]]

Мысль такая. Нужно получить массив вида:

[
   [11, 0],
   [22, 1],
   [33, 2],
   [44, 3]
]

Или такого вида

[
   [0, 11],
   [1, 22],
   [2, 33],
   [3, 44]
]

 

Задача

Нужно выложить все вложенные массивы на один уровень так, чтобы сохранялась очерёдность появления элементов как в оригинальном массиве, плюс чтобы каждому элементу оригинального массива присваивался уровень глубины.

Функция получения глубины каждого элемента массива

function elementDepth(array) {
   function extract(arr) {
      var newArr = [];
      for (i = 0, z = 0; arr[i] != undefined; i++, z++) {
         if (arr[i][1].constructor.name != "Array") {
         newArr[z] = arr[i]
         } else {
         newArr.push(...arr[i][1].map(e => [arr[i][0] + 1, e]));
         z += arr[i][1].length - 1;
         }
      }
      if(newArr.filter(i => i != undefined).length != newArr.length){
         var g = newArr.map(i=>{if(i == undefined){return [-1, ""]} else {return i}});
         return extract(g);
      }
      else if (newArr.filter(i => i[1].constructor.name == "Array").length > 0) {
         return extract(newArr);
      } else {
         return newArr;
      }
   }
   var x = array.map(i => [0, i]);
   return extract(x);
}

 

Как работает функция?

В функцию elementDepth() мы передаём нужный нам массив. Затем мы делаем первичную трансформацию оригинального массива и создаём пары: нулевая глубина вложенности / элемент массива.

Из такого:

[111, [222, 333]]

Получаем такое:

[
   [0, 111],
   [0, [222, 333]]
]

В таком виде подготовленный массив передаём во внутреннюю функцию-экстрактор. Это рекурсивная функция и она вызывает сама себя в том случае, если элементом подготовленного массива является массив.

Каждый вызов функции находит вложенные массивы и распаковывает их элементы наверх, передавая глубину вложенности.

 

Пример для тестирования

var massiv = [ 11, [22,,,,,"22"], [301, [33, "33"], 302], [400, [401, 402, [44, "44"]]]  ]

Команда запуска функции

var ed = elementDepth(massiv)

Обратите внимание. В примере есть неопределённые элементы в виде запятых. Это сделано специально, чтобы показать как функция отрабатывает «несуществующие» элементы. Она возвращает пустую строку и присваивает глубину «-1». Элемент сохраняется в массиве, чтобы информировать разработчика о том, что оригинальный массив не полный.

Функция определения глубины--каждого элемента массива--(оригинального и вложенного) - JavaScript
Функция определения глубины каждого элемента массива — (оригинального и вложенного) — JavaScript

 

Информационные ссылки

JavaScript | Как узнать глубину массива?

JavaScript | Как вытащить элементы массивов в массивах на один уровень?

Поделись записью