Answer

Answer

t.me/js_test

Ответ:

Array.prototype.customSort = function (whatToSort, compareFn) {
    const sorted = this.filter(whatToSort).sort(compareFn);

    return this.map((v) => (whatToSort(v) ? sorted.shift() : v));
};

Объяснение:

Фильтруем наш массив с помощью метода filter и используем функцию whatToSort как предикат для фильтрации. Затем сразу сортируем отфильтрованный массив с помощью метода sort и функции compareFn, и сохраняем всё в переменную sorted. После идём по исходному массиву с помощью метода map и если значение должно быть отсортировано то заменяем его на первый элемент массива sorted и обрезаем этот массив, если же значение не должно быть отсортировано то ничего не делаем.

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

Array.prototype.customSort = function (whatToSort, compareFn) {
    const sorted = this.filter(whatToSort).sort(compareFn);

    return this.map((v) => (whatToSort(v) ? sorted.shift() : v));
};

const isOdd = (n) => n % 2 !== 0;
const isEven = (n) => n % 2 === 0;
const isPrime = (num) => {
    for (let i = 2, s = Math.sqrt(num); i <= s; i++) {
        if (num % i === 0) {
            return false;
        }
    }
    return num > 1;
};

const asc = (a, b) => a - b;
const desc = (a, b) => b - a;

console.log([5, 3, 2, 8, 1, 4].customSort(isOdd, asc));
console.log([5, 3, 2, 8, 1, 4].customSort(isEven, desc));
console.log([7, 6, 5, 4, 3, 2, 1].customSort(isPrime, asc));
console.log([].customSort(isOdd, desc));

Report Page