Нет поддержки для точно того, что вы описываете, но довольно просто написать стандартную функцию .sort
, которая достигает того же с минимальным кодом - просто верните разницу между вызовом keyFunc
по двум аргументам sort
:
function keyFunc(value){
// complicated custom logic here, if desired
return Math.abs(value);
}
myArr = [1, 3, -2];
myArr.sort((a, b) => keyFunc(a) - keyFunc(b));
console.log(myArr);
// the result should be [1, -2, 3]
Если функция ключа сложна, и вы не хотите запускать ее больше, чем необходимо, тогда было бы довольно просто создать таблицу поиска для каждого ввода, получая доступтаблица поиска, если keyFunc
был вызван с этим значением ранее:
const keyValues = new Map();
function keyFunc(value){
const previous = keyValues.get(value);
if (previous !== undefined) return previous
console.log('running expensive operations for ' + value);
// complicated custom logic here, if desired
const result = Math.abs(value);
keyValues.set(value, result);
return result;
}
myArr = [1, 3, -2];
myArr.sort((a, b) => keyFunc(a) - keyFunc(b));
console.log(myArr);
// the result should be [1, -2, 3]