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]]