Полифил это! Плоская, карта, фильтр и уменьшение - жесткий путь

Полифил это! Плоская, карта, фильтр и уменьшение - жесткий путь

7 августа 2025 г.

Хорошо, время исповеди, я уже давно пишет JavaScript, но есть что -то странно приятное в возвращении к основам. Вы знаете, как попытка испечь ваш хлеб с нуля, даже если вы живете рядом с пекарней. Это именно то, о чем этот пост: выпекать наши версии некоторых классических методов массива.


Хотите понять, что такое полифиллы?Я рассмотрел их в своем блоге для звонка, применения и привязки.


Почему? Потому что это весело. Потому что это образовательно. И потому что в следующий раз, когда кто -то бросит на вас техническое интервью, как «Можете ли вы написать свой собственныйreduce«И вы случайно скажете:« Конечно, вы хотите это с комментариями или без? »


Сегодня строили полифиллы для:

  • flat()
  • map()
  • filter()
  • reduce()


Получите мой передний конец подготовки, бесплатно для первых 50 человекКликните сюда.


Давай катимся.


flat()Блинной стек для массивов

if(!Array.prototype.myFlat){
    Array.prototype.myFlat = function(depth){
        if(depth < 0) return this;

        const flatten = function(arr, depth){
            return arr.reduce((acc,ele)=>{
                if(Array.isArray(ele) && depth > 0){
                    acc = acc.concat(flatten(ele,depth -1));
                }else{
                    acc.push(ele);
                }
                return acc;
            },[])
        }

        return flatten(this,depth);
    }
}

const nestedArray = [1, [2, [3, [4, 5]]], 6];

console.log(nestedArray.myFlat()); // Default depth = 1 => [1, 2, [3, [4, 5]], 6]
console.log(nestedArray.myFlat(2)); // Depth = 2 => [1, 2, 3, [4, 5], 6]
console.log(nestedArray.myFlat(3)); // Depth = 3 => [1, 2, 3, 4, 5, 6]
console.log(nestedArray.myFlat(0)); // Depth = 0 => [1, [2, [3, [4, 5]]], 6]


Просто основная сглаживающая функция. Заменит ли это вашу бэкэндскую работу? Нет. Но заставит ли вы чувствовать себя круто? Абсолютно.

map()Потому что иногда массивы нуждаются

if(!Array.prototype.myMap){
    Array.prototype.myMap = function(fn, thisArg){
       if(this == null)  { return new Error("Not an array")};

       if(typeof(fn) != 'function') {return new Error("Not an array")}

       let result = [];

       for(let i=0; i< this.length; i++){
           if(i in this){
               result.push(fn.call(thisArg,this[i], i, this));
           }
       }
       return result;
    }
}

a = [1,2,3,4,5].myMap(function (mem) {
    return mem*mem;
})

console.log(a); // [ 1, 4, 9, 16, 25 ]

Простой и чистый. Никаких магических заклинаний.

filter()Только достойные пройдут

if(!Array.prototype.myFilter){
    Array.prototype.myFilter = function(fn, thisArg){
       if(this == null)  { return new Error("Not an array")};

       if(typeof(fn) != 'function') {return new Error("Not an array")}

       let result = [];

       for(let i=0; i< this.length; i++){
           if(i in this && fn.call(thisArg,this[i], i, this)){
               result.push(this[i]);
           }
       }
       return result;
    }
}

b = [1,2,3,4,5].myFilter(function (mem) {
    return mem > 1;
})

console.log(b) //[ 2, 3, 4, 5 ]



Дайте ему тестовый запуск со своими собственными странными условиями. Даже отфильтроровать людей, которые не любят кофе; Ваш звонок.

reduce()Уровень босса

if(!Array.prototype.myReduce){
    Array.prototype.myReduce = function(callback,initialValue){
        if(this == null) {return new Error("Not an Array");}

        if(typeof(callback) != 'function') {
            return new Error("Not a function");
        }

        let arr = this;
        let len = arr.length;

        let hasInitial = arguments.length > 1;
        let accumulator = hasInitial ? initialValue : arr[0];
        let startIndex = hasInitial ? 0 : 1;

        if (len === 0 && !hasInitial) {
          throw new Error("Reduce of empty array with no initial value");
        }


        for (let i = startIndex; i < len; i++) {
          if (i in arr) {
            accumulator = callback(accumulator, arr[i], i, arr);
          }
        }

        return accumulator;
    }
}

let a = [1, 2, 3].myReduce((acc, val) => acc + val, 0);
console.log(a);

Сокращение похоже на тот друг, который сначала кажется пугающим, но как только вы узнаете их, они несут всю команду.


Зачем это?

Возможно, вам никогда не нужно использовать их в производственном приложении. Но знание того, как они работают, помогает вам:

  • Поймите основы JavaScript лучше.
  • Цените встроенные методы больше.
  • Есть что -нибудь классное, чтобы сказать в интервью или притворяться, что отладки в кафе.


Так что продолжайте, свяжитесь с ними, добавьте свой собственный вкус и, возможно, даже продлите еще пару методов просто для удовольствия.


Вот и все, ребята! Надеюсь, вы нашли это полезным. Если вам понравилось, посмотрите больше статей в моем блоге,https://blog.nandan.dev/

Не стесняйтесь комментировать, напишите мне наconnect@nandan.dev, или свяжитесь со мной в Twitter, Instagram или GitHub.


Не забудьте подписаться на мою новостную рассылку для регулярных обновлений по темам JavaScript!


Twitter | Instagram | Github | Website


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE