Это один из наиболее часто задаваемых вопросов на любом собеседовании по JS, давайте обсудим его сегодня.

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

Шаги для создания полифилла для метода flatten для массива:

  1. Поскольку нам нужно создать полифилл для flatten, который является методом массива, нам нужно будет добавить его в прототип массива, чтобы он был доступен для всех массивов в javascript, например, как у нас есть сокращенный метод фильтра карты, доступный как методы массива.
Array.prototype.flatten = function (){
}
let arr = [1, [2,[3],4, [5,[6,[7, [8]]],9]]]
arr.flatten() // flatten method is available now for arr array

2. Этот метод flatten должен возвращать окончательный массив, поэтому у нас есть выходной массив, в который мы будем помещать все значения, которые будут возвращены в конце.

Array.prototype.flatten = function (){
    let output = [];
    return output;
}
let arr = [1, [2,[3],4, [5,[6,[7, [8]]],9]]]
arr.flatten() //returns [];

3. Теперь нам нужно получить значение для arr в нашей функции flatten, которое можно получить с помощью этого ключевого слова, поскольку здесь оно принадлежит arr, когда flatten вызывается как метод для arr.

Array.prototype.flatten = function (){
    let output = [];
    let arr = this; // here arr = [1, [2,[3],4, [5,[6,[7, [8]]],9]]]
    return output;
}
let arr = [1, [2,[3],4, [5,[6,[7, [8]]],9]]]
arr.flatten() //returns [];

4. Теперь, когда у нас есть arr, доступный внутри нашей функции flatten, мы должны выполнить итерацию по массиву arr, чтобы проверить, является ли значение массивом или простым числом. Если это массив, мы будем рекурсивно вызывать функцию для повторной итерации, иначе, если это числовое значение, мы можем добавить его к выходному объекту.

Чтобы проверить, является ли значение массивом, мы будем использовать следующий метод

Array.isArray(arr) 
arr = [1,2] // return true 
arr = 1 // return false

Мы создаем еще одну функцию flat внутри функции flatten, здесь flatten образует закрытие над flat, и flat сможет получить доступ ко всем переменным и функциям, объявленным в flatten.

Вот как плоская функция во время рекурсии также имеет доступ к выводу, где хранится окончательный вывод.

Наконец, на выходе получается сглаженный массив, и полный полифилл выглядит так:

Array.prototype.flatten = function (){
    let output = [];
    let arr = this;
    const flat = (arr) => {
      for(let i =0 ; i < arr.length; i++) {
         if(Array.isArray(arr[i])) flat(arr[i])
         else output.push(arr[i]);
      }
    }
    flat(arr);
    return output;
  }

let arr = [1, [2,[3],4, [5,[6,[7, [8]]],9]]]
console.log(arr.flatten()) // [1, 2, 3, 4, 5, 6, 7, 8, 9]

Это один из самых простых способов создания полифилла для выравнивания массива. Надеюсь, поможет.