[英]JavaScript custom sort function to prioritize a letter
我已经有一个排序数组(最多可以包含1,000个项目),我只想获取以指定字符开头的项目块并将它们移到顶部。
// 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);
这是一个选项:
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
上都得到准确的比较。 对于性能测试,我忽略了所有测试用例的可能性。
这是一个排序算法,它实际上将以“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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.