0

私は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"
}];

オブジェクトを「シリアル」フィールドでソートし、次のようにする方法を知りたいです(シリアル文字列の整数の値を考慮して):

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

前もって感謝します。

4

2 に答える 2

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

フィドルでそれを参照してください

頻繁にソートする場合、またはリストが非常に長い場合は、オブジェクトに格納されるシリアル値の「正規化された」バージョンを作成することを検討する必要があります。これは、serialCompare 関数内で計算された配列、または先行ゼロで同じ長さにパディングされたテキスト番号部分である可能性があります。

于 2012-08-07T01:08:32.147 に答える
1

プロパティの 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');
于 2012-08-06T21:13:31.523 に答える