javascript - 如何为 javascript 排序函数制作一个有效的比较器来对字符串数组进行排序?

标签 javascript string sorting comparator

我有一个字符串数组,如下所示:

array = ['third', 'first', 'fourth', 'second', 'custom2', 'custom1']

我想对这个数组进行排序,所以它看起来像:

array = ['first', 'second', 'third', 'fourth', 'custom2', 'custom1']

特定字符串如'first'、'second'、...应按给定顺序排序(第一个、第二个、第三个...),任何其他字符串应附加在末尾以任意顺序。无论如何,仅包含这些字符串子集的数组应该按正确的顺序排序:

['fourth', 'something', 'second'] => ['second', 'fourth', 'something']

我想知道是否有可能为 javascript sort() 函数编写一个比较器函数来有效地解决这个问题。

最佳答案

类似这样的东西吗?

array = ['third', 'first', 'fourth', 'second', 'custom2', 'custom1']
special = ['first', 'second', 'third', 'fourth']

array.sort(function(a, b) {
    var ia = special.indexOf(a)
    var ib = special.indexOf(b)

    if(ia >= 0 && ib >= 0) return ia - ib;

    if(ia >= 0) return -1;
    if(ib >= 0) return +1;

    return a > b ? 1 : a == b ? 0 : -1;
})

console.log(array)
[
 "first",
 "second",
 "third",
 "fourth",
 "custom1",
 "custom2"
]

或者,更好的是,使用 schwartzian transform :

a = array.map(function(x) {
    var n = special.indexOf(x);
    return [n < 0 ? array.length : n, x]
}).sort(function(a, b) {
    return (a[0] - b[0]) || (a[1] > b[1] ? 1 : a[1] == b[1] ? 0 : -1);
}).map(function(x) {
    return x[1]
})

关于javascript - 如何为 javascript 排序函数制作一个有效的比较器来对字符串数组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17420773/

相关文章:

jquery - jquery中分割字符串

javascript - 如何按定义的顺序创建数组,如下所示?

javascript - 是否可以使用 CSS 突出显示相邻的相同值表格单元格?

javascript - 如何让我的滑动条通过刷新保持位置

Javascript 扩展不起作用

c++ - 使用快速排序对可能包含无穷大的容器进行排序是否安全?

ruby-on-rails - 在 Rails View 中排序而不显示重复项

javascript - AngularJS ng-init 指令被分配了函数和 promise

python - Python 2/3 中的编码/解码有什么区别

提取字符串崩溃的代码