说我有Person对象的数组:排序在JavaScript
var people = [{name: "Joe Schmo", age: 36}, {name: "JANE DOE", age: 40}];
和我有可以排序字符串箱子的阵列不区分大小写的函数:
function caseInsensitiveSort(arr) { ... }
是否有任何直接的方法来结合我现有的排序功能Array.prototype.map
排序people
阵列只使用name
键?
I.e.它会产生
var people = [{name: "JANE DOE", age: 40}, {name: "Joe Schmo", age: 36}];
做手工也不是很难在这种特殊情况下,
people.sort(function (a, b) {
return a.name.localeCompare(b.name);
});
,但我想不出这样做的一种方式,让我用预现有的排序功能。在排序功能更加定制的情况下,这将是有用的。
编辑:我相信这里的核心问题是要做到这一点,你需要能够弄清楚当你对代理数组进行排序时,原始索引被映射到了什么位置。在一般情况下,使用JS的本地sort
函数获得这些新索引似乎不可能。但我很乐意被证明是错误的。
编辑:我试图做到这一点的方式效率太低,无法使用。请参阅下面的答案,使用比较函数替代解决方案。
如果'caseInsensitiveSort'接受一个数组,你需要在名称的数组给该函数的名称进行排序,然后基于与名称阵列上的对象数组排序。听起来像是一种非常复杂的方式来做简单的事情。 – adeneo
它会处理几个元素吗?因为'Array.prototype.map'方法创建一个新数组,所以对于数百万条记录来说,最好的选择就是对它进行就地排序。 –
@adeneo @Jordan你们俩都是对的。正如xdazz在下面指出的,正确的方法是将我的比较逻辑抽象为一个单独的函数,并将其提供给'Array.prototype.sort',而不是试图将我的排序函数放入。 –