この配列を日付で並べ替えるにはどうすればよいですか(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/
前もって感謝します!
@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);
});
古いバージョンのWebKitとInternetExplorerはISO8601の日付をサポートしていないため、互換性のある日付を作成する必要があります。これは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を含むように使用法を更新しました
私はこれで行きます:
console.clear();
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' }
console.dir(myArray);
var newArray = myArray.sort(function(a,b){
if (a.date < b.date) return -1;
else if (a.date > b.date) return 1;
else return 0;
});
console.dir(newArray);
日付の作成を回避し、組み込みの辞書式比較関数 String.prototype.localeCompare を使用することで、 ?:
複合演算子またはその他の式:
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'}
];
// Oldest first
console.log(
myArray.sort((a, b) => a.date.localeCompare(b.date))
);
// Newest first
console.log(
myArray.sort((a, b) => -a.date.localeCompare(b.date))
);
$(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;
}
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) });
P.s.次のような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' }
];
デモ: 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));
注意してください。受け入れられた回答は、日付を辞書式にソートするようにアドバイスしています。
ただし、これは、すべての文字列が「Z」または「+00」タイムゾーン(= UTC)を使用している場合にのみ機能します。 「Z」で終わる日付文字列はISO8601標準を満たしていますが、すべてのISO8601が「Z」で終わっているわけではありません。
したがって、ISO8601に完全に準拠するには、いくつかのDateライブラリ(例: Javascript Date または Moment.js )を使用して文字列を解析し、これらのオブジェクトを比較する必要があります。この部分については、ISO8601と互換性のないブラウザーも対象とするScottの回答を確認できます。
Javascript Dateを使用した私の簡単な例(古すぎないブラウザーで動作します):
var myArray = [
{ name:'oldest', date:'2007-01-17T08:00:00Z' },
{ name:'newest', date:'2011-01-28T08:00:00+0100' },
{ name:'old', date:'2009-11-25T08:00:00-0100' }
];
myArray.sort(function(a, b) {
return new Date(a.date) - new Date(b.date);
});
欠点:これは、文字列を辞書式に比較するよりも時間がかかります。
ISO8601標準の詳細: ここ 。