JSFiddle - React, Tailwind, and code Playground
by podgorniy
JavaScript
'use strict';
function isArray (obj) {
return Object.prototype.toString.call(obj)==='[object Array]';
}
function flatten(arr){
var iarr=[]; //берем глобальную (для функции flattenk)переменную с массивом, определяем её
var k=0; //переменная счетчика для "обрезки" рекурсии дабы многомерность уменьшалась в один шаг
function flattenk(arr){
k+=1; // функция сработала 1 раз
if (arr.length!=0){ //если входной массив не пустой, то
for(var i=0;i<arr.length;i+=1){ //"бежим" по нему
if (isArray(arr[i])===false) { //если элемент входного массива не массив, то
iarr.push(arr[i]); //в конец глобального массива записываем этот элемент
}
else if (k<2){ //иначе если элемент массив и функция отработала всего 1 раз
iarr=flattenk(arr[i]); //запускаем рекурсивно нашу функцию с аргументом "елементомассива"
}
else {
iarr.push(arr[i]);//отработала больше 1 раза - не убиваем всю многомерность и добавляем наш "елементомассив" в конец глобального массива
}
}
}
else if (iarr.length===0) iarr=arr; //входной массив пуст и глобальный массив пуст то передаем ссылку с входного на глобальный (для случая flatten([]))
else
iarr.push(arr); //или же в глобальный массив добавляем наш пустой "елементомассив"
k=1; //устанавливаем счетчик срабатываний функции в 1, чтоб рекурсия сработала по всем елементам входного массива
return iarr; //возвращает функция обновленный глобальный массив
}
return flattenk(arr);//дублируем результат для функции-обертки
}
console.log(flatten([1,1,1,[[1]]])); // [1, 1, 1, [1]]