Javascript用数字排序对象字符串

时间:2012-08-06 21:10:01

标签: javascript

我在javascript中有以下JSON对象:

var stuff = [{
"id": "20",
"serial": "0/0/19:46,0/0/149:63"
}, {
"id": "8",
"serial": "0/0/151:215,0/0/151:233"
}, {
"id": "54",
"serial": "0/0/151:26,0/0/151:37"
}, {
"id": "22",
"serial": "0/0/155:29,0/0/155:36"
}, {
"id": "4",
"serial": "0/0/151:48,0/0/151:152"
}];

我想知道如何通过“serial”字段对对象进行排序,将其保留为这样(考虑到串行字符串中整数的值):

var stuff = [{
"id": "20",
"serial": "0/0/19:46,0/0/149:63"
}, {
"id": "54",
"serial": "0/0/151:26,0/0/151:37"
}, {
"id": "4",
"serial": "0/0/151:48,0/0/151:152"
}, {
"id": "8",
"serial": "0/0/151:215,0/0/151:233"
}, {
"id": "22",
"serial": "0/0/155:29,0/0/155:36"
}];

提前致谢。

2 个答案:

答案 0 :(得分:1)

您有一个对象数组,您希望按其属性之一对其进行排序。你可以很容易地这样做:

stuff.sort(function(a,b) {return a.serial == b.serial ? 0 : a.serial < b.serial ? -1 : 1;});

或者,你可以有一个更通用的功能:

function sort(input,prop) {
    input.sort(function(a,b) {return a[prop] == b[prop] ? 0 : a[prop] < b[prop] ? -1 : 1;});
}
// call with:
sort(stuff,'serial');

答案 1 :(得分:1)

这将为你做到:

var normalizer = /[:\/]/g;

function serialCompare(a, b) {
    var alist = a.serial.replace(normalizer, ',').split(','),
       blist = b.serial.replace(normalizer, ',').split(','),
       i = 0, l = alist.length;
    while (alist[i] === blist[i] && i < l) {
        i += 1;
    };
    return (parseInt(alist[i], 10) - parseInt(blist[i], 10));
}

sortedstuff = stuff.sort(serialCompare);
// returns array sorted as you asked

See it in a fiddle

如果您要经常排序,或者列表很长,您应该考虑创建存储在对象中的序列值的“规范化”版本。它可以是在serialCompare函数内部计算的数组,也可以是用前导零填充到相同长度的文本数字部分。