Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript自定义排序函数,用于对字母进行优先级排序_Javascript_Performance_Sorting - Fatal编程技术网

JavaScript自定义排序函数,用于对字母进行优先级排序

JavaScript自定义排序函数,用于对字母进行优先级排序,javascript,performance,sorting,Javascript,Performance,Sorting,我已经有了一个排序数组(最多可以包含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" } 我对Java

我已经有了一个排序数组(最多可以包含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);
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++;
        }
    }
}
演示:

它将删除以指定字母开头的任何项,并将其移动到数组的开头。因此,阵列被修改到位

可以很容易地修改它,以允许传递项必须以其开头的字符串(而不仅仅是字母)

更新:

至于性能,当涉及到这个问题的当前答案时,这种方法似乎最快

下面是我做的性能测试:

它使用一个按字母顺序排列有数百个项目的数组(比10个左右的测试用例更好)。这可能不是生成数组的最佳方式,但它正确地执行了该操作,并且该部分无论如何与实际计时无关(它在计时之外运行)


请注意,我的函数被修改为不使用
toLowerCase
,因此在比较第一个字母和目标字母时,所有函数都应“相等”。当然,如果您希望它更精确,那么在数组中项目的第一个字母可以是大写(或者传递大写字母)的情况下,您必须使用
toLowerCase
on进行精确比较。对于性能测试,我忽略了所有测试用例的这种可能性。

这里有一个排序算法,它实际上会对从“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);

这实际上并没有对数组进行排序。它所做的只是将以“d”开头的任何内容移动到数组的开头。它假定数组已经正确排序,除此之外。@ryanbrill来自OP-“我已经有一个排序数组”。你认为“分类”有什么作用?它可以移动物品…@Ian Yep,我只是想对后来来的人说,如果数组还没有排序,这将不起作用。它还将添加一些额外的处理,因为您需要对数组进行排序,然后将所有带有“d”的内容移到开头,而不是在排序例程中进行所有操作。由于OP将其标记为“性能”,因此似乎值得一提。也就是说,我实际上没有运行任何基准测试,我只是假设一个操作比两个操作更快。:)@瑞安布里尔说得很好。我从未想过这个答案会非常有效,但它完成了任务。这是一个性能测试,希望能正确地使用我们所有的4种方法:)@Ian,“最多可以包含1000个项目”。哇,你的解决方案粉碎了这个测试:@canon是的,没想到-我认为
sort
会做得更好,+1,尽管这在很大程度上不会引起注意/你可能应该接受@Ian的答案,因为你关心的是性能。