5

'date'文字列プロパティを持つオブジェクトの配列があります。すなわち:

[
    {
        id: 1,
        startDate: '2011-4-22'
    },
    {
        id: 2,
        startDate: '2012-3-15'
    },
    {
        id: 3,
        startDate: '2011-4-22'
    },
    {
        id: 4,
        startDate: '2012-2-10'
    }
]

日付文字列を日付に変換し、startDateDESCで並べ替えたいだけです。誰かがunderscore.js_sortByメソッドを使用してこれを行う方法を教えてもらえますか、それとも単なるjavascriptでも可能です。

ありがとう!

4

4 に答える 4

15

Underscore ソリューションは次のようになります。

a = [ /* ... */ ];

function to_date(o) {
    var parts = o.startDate.split('-');
    o.startDate = new Date(parts[0], parts[1] - 1, parts[2]);
    return o;
}
function desc_start_time(o) {
    return -o.startDate.getTime();
}
var b = _.chain(a)
         .map(to_date)
         .sortBy(desc_start_time)
         .value();

もちろん、名前付き関数を使用する必要はありませんが、名前によってロジックが少し明確になります。

デモ: http://jsfiddle.net/ambiguous/qe9sZ/

プレーンな JavaScript では、次のようにできます。

for(var i = 0, parts; i < a.length; ++i) {
    parts = a[i].startDate.split('-');
    a[i].startDate = new Date(parts[0], parts[1] - 1, parts[2]);
}
var b = a.sort(function(a, b) {
    return b.startDate - a.startDate;
});

デモ: http://jsfiddle.net/ambiguous/rPAPG/

于 2012-04-20T00:08:56.620 に答える
4

forEachあなたのためにそれを処理する必要がありsortます:

var data = [
    {
        id: 1,
        startDate: '2011-4-22'
    },
    {
        id: 2,
        startDate: '2012-3-15'
    },
    {
        id: 3,
        startDate: '2011-4-22'
    },
    {
        id: 4,
        startDate: '2012-2-10'
    }
];

var i, c;

for(i = 0; c = data[i]; i++) {
    var parts = c.startDate.split('-');

    c.startDate = new Date(+parts[0], +parts[1] - 1, +parts[2]);
}

data.sort(function(a, b) {
    return b.startDate - a.startDate;
});

これがデモです。コンソールを確認してください。

于 2012-04-19T23:13:25.820 に答える
0

I did it this way:

 var sorted = _(list).sortBy(
                    function (item) {                        
                        return [new Date(item.effectiveDate).getTime(), item.batchId];
                    }), "batchId");

If you want it descending then it's the same thing but *-1

 var sorted = _(list).sortBy(
                    function (item) {                        
                        return [new Date(item.effectiveDate).getTime()*-1, item.batchId];
                    }), "batchId");

In this example I am ordering by two fields, you can forget about the item.batchId.

Hope this helps someone.

于 2015-11-24T17:48:32.317 に答える