【发布时间】:2015-06-24 14:27:17
【问题描述】:
假设我有一个 Person 对象数组:
var people = [{name: "Joe Schmo", age: 36}, {name: "JANE DOE", age: 40}];
我有一个函数可以不区分大小写地对字符串数组进行排序:
function caseInsensitiveSort(arr) { ... }
是否有任何直接的方法可以将我现有的排序功能与Array.prototype.map 结合使用name 键对people 数组进行排序?
即它会产生
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接受一个数组,您需要将一个名称数组传递给该函数,对名称进行排序,然后根据具有名称的数组对包含对象的数组进行排序。听起来像是一种非常复杂的方法来做一些简单的事情。 -
它会处理几个元素吗?因为
Array.prototype.map方法创建了一个新数组,所以对于数百万条记录,最好的选择是就地排序。 -
@adeneo @Jordan 你们都是对的。正如 xdazz 在下面指出的那样,有效地执行此操作的正确方法是将我的比较逻辑抽象为一个单独的函数,并将其提供给
Array.prototype.sort,而不是试图将我的排序函数插入其中。
标签: javascript arrays sorting dictionary