按“order”字段对数组进行排序,可以是未定义的

时间:2013-09-20 13:21:51

标签: javascript arrays sorting

我有一个数组:

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

我想按字段q.o对其进行排序,但此字段可能未定义。 我需要得到如下例子的结果:

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字段的脚本。

3 个答案:

答案 0 :(得分: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++;
    }
}

Working demo

答案 1 :(得分:0)

使用underscore.js并使用sortBy功能var out = sortBy(q,'s');

答案 2 :(得分:-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;
});