2

私は配列を持っています:

var q = [
    {s: 'last', o: 1000},
    {s: 's2'},
    {s: 's8'},
    {s: 's6'},
    {s: 's1', o: 1},
    {s: 's7'},
    {s: 's9'},
    {s: 's3', o: 3},
    {s: 's5', o: 5},
    {s: 's4', o: 4},
    {s: 's10', o: 10}
]

フィールド qo で並べ替えたいのですが、このフィールドは未定義である可能性があります。以下の例のような結果を得る必要があります。

var out = [
    {s: 's1', o: 1},
    {s: 's2'},
    {s: 's3', o: 3},
    {s: 's4', o: 4},
    {s: 's5', o: 5},    
    {s: 's8'},
    {s: 's6'},
    {s: 's7'},
    {s: 's9'},
    {s: 's10', o: 10},
    {s: 'last', o: 1000}
]

upd: s実際のプロジェクトのオブジェクトで、起動するスクリプトが含まれています。すべてのスクリプトを定義した順序で起動する必要がありますが、その前に、oフィールドを持つスクリプトをその場所に挿入する必要があります。

4

3 に答える 3

1

これはどう?

var out = [];

var a1 = [],
    a2 = [];
for (var i = 0; i < q.length; i++) {
    if (q[i].o) {
        a1.push(q[i]);
    } else {
        a2.push(q[i]);
    }
}
a1.sort(function (a, b) {
    return a.o - b.o;
});

var aux = a1[0].o;
while (a1.length || a2.length) {
    if ((a1.length && a1[0].o == aux) || a2.length == 0) {
        if(a1[1] && a1[1].o > a1[0].o) aux++;
        out.push(a1.shift());
    } else if(a2.length) {
        out.push(a2.shift());
        aux++;
    }
}

ワーキングデモ

于 2013-09-20T13:57:53.537 に答える
0

underscore.jsを使用し、sortBy 機能を使用します var out = sortBy( q, 's' );

于 2013-09-20T13:34:20.250 に答える
-1
var out = q.sort(function (a,b){
    if (a.o!=null && b.o!=null){
        return a.o-b.o;  
    }
    return a.s>b.s?1:-1;
});
于 2013-09-20T13:34:06.017 に答える