这些答案都不是在排序中使用多个字段的通用方法的理想选择。上述所有方法都是低效的,因为它们要么需要对数组进行多次排序(这在足够大的列表上可能会减慢很多速度),要么会生成大量的垃圾对象,VM 需要清理这些对象(并最终减慢速度)程序关闭)。
这是一个快速、高效、轻松允许反向排序的解决方案,可以与underscore
或一起使用lodash
,或直接与Array.sort
最重要的部分是compositeComparator
方法,它接受一组比较器函数并返回一个新的复合比较器函数。
/**
* Chains a comparator function to another comparator
* and returns the result of the first comparator, unless
* the first comparator returns 0, in which case the
* result of the second comparator is used.
*/
function makeChainedComparator(first, next) {
return function(a, b) {
var result = first(a, b);
if (result !== 0) return result;
return next(a, b);
}
}
/**
* Given an array of comparators, returns a new comparator with
* descending priority such that
* the next comparator will only be used if the precending on returned
* 0 (ie, found the two objects to be equal)
*
* Allows multiple sorts to be used simply. For example,
* sort by column a, then sort by column b, then sort by column c
*/
function compositeComparator(comparators) {
return comparators.reduceRight(function(memo, comparator) {
return makeChainedComparator(comparator, memo);
});
}
您还需要一个比较器函数来比较您希望排序的字段。该naturalSort
函数将创建一个给定特定字段的比较器。为反向排序编写一个比较器也很简单。
function naturalSort(field) {
return function(a, b) {
var c1 = a[field];
var c2 = b[field];
if (c1 > c2) return 1;
if (c1 < c2) return -1;
return 0;
}
}
(到目前为止,所有代码都是可重用的,例如可以保存在实用程序module中)
接下来,您需要创建复合比较器。对于我们的示例,它看起来像这样:
var cmp = compositeComparator([naturalSort('roomNumber'), naturalSort('name')]);
这将按房间号排序,然后是名称。添加额外的排序条件是微不足道的,不会影响排序的性能。
var patients = [
{name: 'John', roomNumber: 3, bedNumber: 1},
{name: 'Omar', roomNumber: 2, bedNumber: 1},
{name: 'Lisa', roomNumber: 2, bedNumber: 2},
{name: 'Chris', roomNumber: 1, bedNumber: 1},
];
// Sort using the composite
patients.sort(cmp);
console.log(patients);
返回以下内容
[ { name: 'Chris', roomNumber: 1, bedNumber: 1 },
{ name: 'Lisa', roomNumber: 2, bedNumber: 2 },
{ name: 'Omar', roomNumber: 2, bedNumber: 1 },
{ name: 'John', roomNumber: 3, bedNumber: 1 } ]
我更喜欢这种方法的原因是它允许对任意数量的字段进行快速排序,不会产生大量垃圾或在排序中执行字符串连接,并且可以轻松使用,以便某些列反向排序,而顺序列使用自然种类。