Answer

Answer

t.me/js_test

Ответ:

Array.prototype.myFilter = function (callback, thisArg) {
    let context = this;
    const result = [];
    if (arguments.length > 1) {
        context = thisArg;
    }

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

Объяснение:

Объявляем две переменные: context и result, переменной context сначала присваиваем this (this в функциях прототипа указывает на объект у которого она была вызвана в нашем случае это массив). Если аргументов передано больше чем 1 это значит в функцию был передан thisArg, в этом случае context присваиваем thisArg. result это массив который будет накаливать нужные элементы. Далее в цикле проходимся по всему массиву и вызываем callback на каждом элементе передавая в него все нужные элементы и вызывая его в нужном контексте с помощью метода call. Если callback возвращает true то пушим текущий элемент в результирующий массив. В конце возвращаем новый массив.

Код для проверки:

Array.prototype.myFilter = function (callback, thisArg) {
    let context = this;
    const result = [];
    if (arguments.length > 1) {
        context = thisArg;
    }

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

console.log([1, 2, 3, 4].myFilter((n) => n % 2 === 0));
console.log([1, 2, 3, 4].myFilter((n) => n % 2 !== 0));

Report Page