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