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));