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.map对people数组进行排序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的本机函数获取这些新索引似乎不可能.但我很高兴被证明是错的.
编辑:我试图这样做的方式效率太低,无法发挥作用.请参阅下面的答案,以获得使用比较函数的解决方案.
您可以使用现有函数获取排序后的名称数组,然后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)
但这效率不高,您应该尝试将比较逻辑从函数中抽象caseInsensitiveSort到caseInsensitiveCompare函数中。
那么你的例子将变成:
people.sort(function (a, b) {
return caseInsensitiveCompare(a.name, b.name);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |