在JavaScript中按照另一个的内容对数组进行排序

Chr*_*ton 9 javascript arrays sorting dictionary

假设我有一个Person对象数组:

var people = [{name: "Joe Schmo", age: 36}, {name: "JANE DOE", age: 40}];
Run Code Online (Sandbox Code Playgroud)

我有一个函数可以对字符串数组进行不敏感的排序:

function caseInsensitiveSort(arr) { ... }
Run Code Online (Sandbox Code Playgroud)

是否有任何简单的方法将我现有的排序功能与仅使用密钥Array.prototype.mappeople数组进行排序name

即它会产生

var people = [{name: "JANE DOE", age: 40}, {name: "Joe Schmo", age: 36}];
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,手工操作并不难,

people.sort(function (a, b) {
    return a.name.localeCompare(b.name);
});
Run Code Online (Sandbox Code Playgroud)

但我想不出一种方法可以让我使用预先存在的排序功能.在排序功能更加个性化的情况下,这将是有用的.

编辑:我认为这里的核心问题是,为了做到这一点,您需要能够找出在对代理数组进行排序时原始索引映射到的内容.sort在一般情况下,使用JS的本机函数获取这些新索引似乎不可能.但我很高兴被证明是错的.

编辑:我试图这样做的方式效率太低,无法发挥作用.请参阅下面的答案,以获得使用比较函数的解决方案.

xda*_*azz 4

您可以使用现有函数获取排序后的名称数组,然后people通过比较排序后的名称数组中的索引来对数组进行排序。

var names = caseInsensitiveSort(people.map(function(person) { 
    return person.name;
}));

people.sort(function (a, b) {
    return names.indexOf(a.name) - names.indexOf(b.name);
});
Run Code Online (Sandbox Code Playgroud)

但这效率不高,您应该尝试将比较逻辑从函数中抽象caseInsensitiveSortcaseInsensitiveCompare函数中。

那么你的例子将变成:

people.sort(function (a, b) {
    return caseInsensitiveCompare(a.name, b.name);
});
Run Code Online (Sandbox Code Playgroud)