Ваш вопрос задает две вещи:
- Как один вызов
sort
для массива, но вызов функции, отличной от Array.sort
?
- Как заставить алгоритм сортировки использовать конкретное поле без его жесткого кодирования?
Ответ на первый вопрос заключается в том, чтобы прикрепить метод sort
к самому объекту homes
:
homes.sort = function () {radixSort(homes, 0, homes.length, bit);}
Как указали один из комментаторов и другие авторы, это может быть очень запутанным. С одной стороны, Arrays.sort
принимает второй параметр, который является функцией сравнения. Radix sort - это сортировка на основе распределения, а не сортировка на основе сравнения, поэтому «переопределение» sort
таким образом не имеет особого смысла. Вы бы проигнорировали функцию сравнения, если бы кто-то ее передал.
Но есть и другая проблема. Ваш radixSort
как написано не работает, потому что он не сравнивает цены. Один из ответов жестко определяет цену, но вы сказали, что вам не нравится эта ситуация. Вы можете исправить это следующим образом: добавьте пятый параметр, который является именем поля. Если значение не определено, используйте сам элемент массива, в противном случае выберите поле. Примерно так (не проверено):
function radixsort (arr, begin, end, bit, field) {
var i = begin, j = end , mask = 1 << bit;
// Use the value of the field at i if present, otherwise the whole element
var at = function (i) {return field in arr ? arr[i][field] : arr[i]};
while (i < j) {
while (i < j && !(arr.at(i) & mask)) {
++i;
}
while (i < j && (arr.at(j-1) & mask)) {
--j;
}
if (i < j) {
j--;
var tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
}
}
if (bit && i > begin) {
radixsort(arr, begin, i, bit - 1);
}
if (bit && i < end) {
radixsort(arr, i, end, bit - 1);
}
}
Теперь вы можете сказать:
homes.sort = function () {radixSort(homes, 0, homes.length, 64, 'price');}
Однако учтите следующее предостережение:
CAVEAT : Если price
является значением с плавающей запятой, сортировка по основанию, вероятно, не будет работать. Лучше всего просто использовать Array.prototype.sort
и передать компаратор для сортировки по различным полям.