2

次のような文字列の配列があります。

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

この配列をソートしたいので、次のようになります。

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

'first'、'second'などの特定の文字列は、指定された順序で並べ替える必要があり (1 番目の前に 2 番目の前に 3 番目の前に ...)、その他の文字列は最後に任意の順序で追加する必要があります。これらの文字列のサブセットのみを含む配列は、とにかく正しい順序でソートする必要があります:

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

この問題を効果的に解決する javascript sort() 関数のコンパレーター関数を作成する可能性があるかどうか疑問に思います。

4

1 に答える 1

4

このようなもの?

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"
]

または、より良いことに、シュワルツ変換を使用します。

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]
})
于 2013-07-02T08:31:17.287 に答える