51

この配列を日付(ISO 8601)で並べ替えるにはどうすればよいですか?

var myArray = new Array();

myArray[0] = { name:'oldest', date:'2007-01-17T08:00:00Z' }
myArray[1] = { name:'newest', date:'2011-01-28T08:00:00Z' }
myArray[2] = { name:'old',    date:'2009-11-25T08:00:00Z' }

遊び場: http:
//jsfiddle.net/4tUZt/

前もって感謝します!

4

7 に答える 7

97

辞書順に並べ替える:

@kdbanmanが指摘しているように、ISO8601の一般原則は、辞書式ソート用に設計されています。そのため、ISO8601 文字列表現は他の文字列と同じように並べ替えることができ、期待どおりの順序になります。

'2007-01-17T08:00:00Z' < '2008-01-17T08:00:00Z' === true

したがって、次のように実装します。

var myArray = [
    { name:'oldest', date:'2007-01-17T08:00:00Z' },
    { name:'newest', date:'2011-01-28T08:00:00Z' },
    { name:'old',    date:'2009-11-25T08:00:00Z' }
];

myArray.sort(function(a, b) {
    return (a.date < b.date) ? -1 : ((a.date > b.date) ? 1 : 0);
});

JavaScript 日付を使用して並べ替える:

古いバージョンの WebKit と Internet Explorer は ISO 8601 の日付をサポートしていないため、互換性のある日付を作成する必要があります。FireFox と最新の WebKit でサポートされていますが、Date.parse サポート JavaScript の詳細については、こちらを参照してください。Date.parse を使用した ISO-8601 日付文字列の解析をサポートするブラウザーはどれですか

これは、Javascript ISO 8601 互換の日付を作成するための非常に優れた記事であり、通常の JavaScript の日付のように並べ替えることができます。

http://webcloud.se/log/JavaScript-and-ISO-8601/

Date.prototype.setISO8601 = function (string) {
    var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
    "(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
    "(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
    var d = string.match(new RegExp(regexp));

    var offset = 0;
    var date = new Date(d[1], 0, 1);

    if (d[3]) { date.setMonth(d[3] - 1); }
    if (d[5]) { date.setDate(d[5]); }
    if (d[7]) { date.setHours(d[7]); }
    if (d[8]) { date.setMinutes(d[8]); }
    if (d[10]) { date.setSeconds(d[10]); }
    if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
    if (d[14]) {
        offset = (Number(d[16]) * 60) + Number(d[17]);
        offset *= ((d[15] == '-') ? 1 : -1);
    }

    offset -= date.getTimezoneOffset();
    time = (Number(date) + (offset * 60 * 1000));
    this.setTime(Number(time));
}

使用法:

console.log(myArray.sort(sortByDate));  

function sortByDate( obj1, obj2 ) {
    var date1 = (new Date()).setISO8601(obj1.date);
    var date2 = (new Date()).setISO8601(obj2.date);
    return date2 > date1 ? 1 : -1;
}

使用法を更新して、ソート技術のクレジット @nbrooks を含めました

于 2012-08-30T08:09:49.977 に答える
6

私はこれで行きます:

const myArray = new Array();

myArray[0] = { name:'oldest', date:'2007-01-17T08:00:00Z' }
myArray[1] = { name:'newest', date:'2011-01-28T08:00:00Z' }
myArray[2] = { name:'old',    date:'2009-11-25T08:00:00Z' }

function byDate (a, b) {
    if (a.date < b.date) return -1; 
    if (a.date > b.date) return 1; 
    return 0;  
}

const newArray = myArray.sort(byDate);


console.clear();
console.dir(myArray);
console.dir(newArray);
于 2012-08-30T08:15:01.940 に答える
2

http://jsfiddle.net/4tUZt/2/

$(document).ready(function()
{ 
    var myArray = [ { name:'oldest', date:'2007-01-17T08:00:00Z' },
        { name:'newest', date:'2011-01-28T08:00:00Z' },
        { name:'old',    date:'2009-11-25T08:00:00Z' }];

    console.log( myArray.sort(sortByDate) );        
});

// Stable, ascending sort (use < for descending)
function sortByDate( obj1, obj2 ) {
    return new Date(obj2.date) > new Date(obj1.date) ? 1 : -1;
}

</p>

于 2012-08-30T08:10:31.300 に答える
2

デモ: http://jsfiddle.net/4tUZt/4/

var myArray = new Array();

myArray[0] = { name:'oldest', date: '2007-01-17T08:00:00Z' };
myArray[1] = { name:'newest', date: '2011-01-28T08:00:00Z' };
myArray[2] = { name:'old',    date: '2009-11-25T08:00:00Z' };

var sortFunction = function (a, b) {
  return Date.parse(b.date) - Date.parse(a.date);
};

/* or

var sortFunction = function (a, b) {
  return new Date(b.date) - new Date(a.date);
};

*/

console.log(myArray.sort(sortFunction));

</p>

于 2012-08-30T08:11:29.717 に答える
1

ISO8601 は、プレーン テキストとして正しく並べ替えるように設計されているため、通常は通常の並べ替えで十分です。

配列内のオブジェクトの特定のキーで並べ替えるには、メソッドに比較関数を指定する必要がありますsort()。他の多くの言語では、cmp関数を使用してこれらを簡単に記述できますが、JS には関数が組み込まれていないcmpため、独自の関数を記述するのが最も簡単です。

var myArray = new Array();

myArray[0] = { name:'oldest', date:'2007-01-17T08:00:00Z' }
myArray[1] = { name:'newest', date:'2011-01-28T08:00:00Z' }
myArray[2] = { name:'old',    date:'2009-11-25T08:00:00Z' }

// cmp helper function - built in to many other languages
var cmp = function (a, b) {
    return (a > b) ? 1 : ( (a > b) ? -1 : 0 );
}

myArray.sort(function (a,b) { return cmp(a.date, b.date) });

Ps 次のように、JSON のような構文を使用して配列を記述します。

var myArray = [
    { name:'oldest', date:'2007-01-17T08:00:00Z' },
    { name:'newest', date:'2011-01-28T08:00:00Z' },
    { name:'old',    date:'2009-11-25T08:00:00Z' }
];
于 2012-12-12T18:14:56.077 に答える