3

我已经有一个排序数组(最多可以包含 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”以找到第一个和最后一个数组索引,并将该范围移动到数组的顶部,但这似乎可能是浪费。有没有更好的办法?

4

3 回答 3

3
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);
于 2013-04-12T17:24:49.310 回答
1

这是一个选项:

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两者获得准确的比较。对于性能测试,我忽略了所有测试用例的这种可能性。

于 2013-04-12T17:36:05.987 回答
0

这是一个排序算法,它实际上将对以“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/

于 2013-04-12T17:37:59.193 回答