JavaScript自定义排序函数,对字母进行优先排序
JavaScript custom sort function to prioritize a letter
我已经有了一个排序数组(可以包含多达1000个项目),我只想把以指定字符开头的项目块移到顶部。
// Before sort
{ "alpha", "beta", "delta", "delta frequency", "gamma", "theta" }
// After sort with "d" as the specified letter
{ "delta", "delta frequency", "alpha", "beta", "gamma", "theta" }
我对JavaScript不太熟悉,不知道如何做到这一点。我的第一个想法是遍历每个项目,看看指定的开始字符的索引是否为"0",以找到第一个和最后一个数组索引,并将该范围移动到数组的顶部,但这似乎可能是浪费。有没有更好的办法?
var array = [ "alpha", "beta", "delta", "delta frequency", "gamma", "theta" ];
var startingWithD = array.filter(function(s) {
return s[0] == "d";
});
var others = array.filter(function(s) {
return s[0] != "d";
});
array = startingWithD.concat(others);
这是一个排序算法,它实际上将以"d"开头的数组权重字符串从头排序。注意,我已经重新排列了开始的数组,以显示排序工作正确。
array = [ "beta", "alpha", "delta frequency", "delta 2", "delta 1", "delta", "gamma", "theta" ];
array.sort(function(a,b) {
if (a[0] == "d" && b[0] != "d") {
return -1
}
if (b[0] == "d" && a[0] != "d") {
return 1;
}
return a > b;
});
console.log(array);
http://jsfiddle.net/ryanbrill/RqfgL/这里有一个选项:
function sortWithPriority(arr, letter) {
var numFound = 0,
i = arr.length,
cur;
while (i-- > numFound) {
cur = arr[i];
if (cur.charAt(0).toLowerCase() === letter.toLowerCase()) {
arr.unshift(arr.splice(i, 1)[0]);
numFound++;
i++;
}
}
}
演示:http://jsfiddle.net/kU8wK/
它将删除所有以指定字母开头的项,并将其移动到数组的开头。这样数组就被修改了。
可以很容易地修改为允许传递一个字符串(而不仅仅是一个字母),该字符串必须以该项开头。
更新:
至于性能,当涉及到这个问题的当前答案时,这种方法似乎是最快的。
下面是我做的性能测试:http://jsperf.com/sort-with-letter-priority
它使用一个按字母顺序包含数百个项目的数组(比10个左右更好的测试用例)。这可能不是生成数组的最佳方式,但它正确地完成了,而且这部分与实际的计时无关(它在计时之外运行)。
注意,我的函数被修改为不使用toLowerCase
,因此在比较第一个字母和目标字母时,所有函数都应该是"相等"的。当然,如果您希望它更准确,在数组中项目的第一个字母可能是大写的情况下(或者您传递了一个大写字母),您必须在和上使用toLowerCase
来获得准确的比较。对于性能测试,我忽略了所有测试用例的可能性。
相关文章:
- ui网格:在自定义表头模板中触发排序
- jquery可从自定义事件中排序
- 我们如何自定义排序JavaScript对象键
- 对Soundcloud自定义播放器播放列表的顺序进行排序
- 高级自定义字段按单选按钮值排序
- ExtJS 4-自定义排序函数只在点击列标题后执行
- 如何使用下划线根据自定义排序顺序对对象数组进行排序
- 通过自定义字母javascript对字符串进行排序
- 从JSON对列表进行自定义排序
- DataTables自定义日期格式排序
- 使用J-query数据表,美国日期格式的自定义排序不起作用
- 当数组的某些部分没有数据时,javascript自定义排序
- AngularJS typeahead添加了按函数自定义排序
- 通过自定义排序 ID 对数据表列进行排序
- 通过跨度自定义值 javascript 对列表重新排序
- 全日历是否支持全天事件的自定义排序
- JQGrid:排序和自定义格式化程序
- AngularJS中的自定义排序函数
- Javascript排序自定义比较器函数-排序一个排序数组
- jQuery排序自定义规则