这些答案都不是理想的通用方法,可以用于在多个字段中排序。上面的所有方法效率低下,因为它们要么需要对数组进行多次排序(这在足够大的列表上可能会减慢很多速度),要么会生成大量垃圾对象,虚拟机将需要清理这些垃圾对象(最终会减慢速度)程序关闭)。
这里的一个解决方案,快速,高效,容易地允许反向排序,并且可以与被使用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;
}
}
(到目前为止,所有代码都是可重用的,例如可以保存在实用程序模块中)
接下来,您需要创建复合比较器。对于我们的示例,它看起来像这样:
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 } ]
我之所以喜欢这种方法,是因为它允许对任意数量的字段进行快速排序,不会在排序内部产生大量垃圾,也不会执行字符串连接,并且易于使用,以便某些列可以反向排序,而顺序列使用自然排序分类。