2016-04-07 8 views
0

オブジェクト配列をDate値で並べ替えるのに問題があります。私は他のユーザーが以前に尋ねた多くの質問を見つけたので、すべての解決策を検討しましたが、私のソート問題の解決策はまだありませんでした。ソート機能をテストするために2つの異なる配列を作成しましたが、正しい順序で日付を取得できませんでした。ここに私のデータは次のとおりです。日付でJavascriptオブジェクトの配列を並べ替える方法は?

[Object { eventDate="12/12/2016", display_order="5"},Object { eventDate="12/12/2016", display_order="3"}] 

[Object { eventDate="04/21/2016", display_order="3"},Object { eventDate="04/21/2016", display_order="1"}] 

私は日付値で自分のデータをソートするために、このロジックを使用:

entries.sort(function(a,b){ 
    var i = new Date(a.eventDate); 
    var j = new Date(b.eventDate); 
    return i-j; 
}); 

私のデータはまだこの機能を使用して、正しい順序で並べ替えませんでした。

dates.sort(function(a, b) { 
    a = new Date(a.dates); 
    b = new Date(b.dates); 
    return a>b ? -1 : a<b ? 1 : 0; 
}); 

私の出力はまだやった:その後、私はこれを実行しようとしました["12/12/2016", "04/21/2016"]

var dates = Object.keys(groupedByDate); 

console.log(dates) 

これは、変数の日付のために出力されます。そして、私はまた、このようになります私の配列をソートしてみました私の日付を正しい順序で並べ替えてはいけません。私は何か間違っているのか、何か他のことが問題であるかどうかはわかりません。誰かが助けてくれたら教えてください。ありがとう。 (ミリ秒の数でDate.getTime()機能を使用して

+0

を私はあなたが昇順で、それをソートしたいと仮定?あなたのソートは私のために働くが、それは降順でそれを注文する....あなたはまた、出力として日付だけを期待している? – MinusFour

+0

あなたの最初のソート関数は正しいと思いますが、Dateコンストラクタの 'datestring'はそうではありません。 Dateインスタンスが正しく構築されているかどうかを確認する必要があります。 – michaPau

答えて

1

ここでの回答は適切なトラックにありますが、Dateコンストラクタ、またはDate.parseを使用して文字列を解析しないでください。ライブラリを使用してフォーマットを渡すか、単純な関数を書いてください。

function parseMDY(s) { 
 
    var b = s.split('/'); 
 
    return new Date(b[2],b[0]-1,b[1]); 
 
} 
 

 
document.write(parseMDY('4/30/2016'));

だから今、あなたは持っている:

entries.sort(function(a,b) { 
    return parseMDY(a) - parseMDY(b); 
}); 
1

ソート日付:

dates.sort(function(a, b) { 
    a = (new Date(a.dates)).getTime(); 
    b = (new Date(b.dates)).getTime(); 
    return a - b; 
}); 
+1

三つ組を気にせず、 'a - b'を返すだけです。 –

+0

@FrédéricHamidi、done – RomanPerekhrest

+0

.getTimeを取得する別の方法は、日付に1を単純に掛けることです。 (新しい日付())* 1 –

1

あなたは日付を分割し、部品を並べ替えることができます。

var array = [{ eventDate: "12/12/2016", display_order: "5" }, { eventDate: "12/12/2016", display_order: "3" }, { eventDate: "04/21/2016", display_order: "3" }, { eventDate: "04/21/2016", display_order: "1" }]; 
 

 
array.sort(function (a, b) { 
 
    var aa = a.eventDate.split('/'), 
 
     bb = b.eventDate.split('/'); 
 
    return aa[2] - bb[2] || aa[0] - bb[0] || aa[1] - bb[1]; 
 
}); 
 

 
document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');

1

あなたが貼り付けられたJSONで問題があるようです。 ={ eventDate="12/12/2016", display_order="3"} .Insteadそれはあなたが正しいJSON形式 は、以下のソリューションが

var array = [{ eventDate:"12/12/2016", display_order:"5"}, 
       { eventDate:"12/12/2016", display_order:"3"}, 
       { eventDate:"04/21/2016", display_order:"3"}, 
       { eventDate:"04/21/2016", display_order:"1"}]; 

// Generic solution 
var sortedArray = array.sort(function(a,b) { 
    return new Date(a.eventDate).getTime() - new Date(b.eventDate).getTime() 
}); 


// Solution using ternary operator 
var l =array.sort(function(a,b){ 
    return a.eventDate>b.eventDate ? -1 : a.eventDate<b.eventDate ? 1 : 0; 
}); 

Demo

0

便利ですだから私は、上記のすべての答えをしようとしたそのうちのいくつかは、私は近くにあったが、持っていると仮定すると、: なければなりません私の場合は完全に解決されていません。だから、僕は結合しようとした、これは私の問題の正しい解決策です:

dates.sort(function(a, b) { 
    return new Date(a).getTime() - new Date(b).getTime(); 
}); 

私は1つのレコードのために働いている、ちょうどAとBを返すようにしようとした場合、私は私のonChangeでユーザーを切り替えると、私をドロップダウン逆の日付に戻っていた。したがって、上記のソリューションはnew Date()getTime()で問題ありません。皆さん、ご協力いただきありがとうございます!

+1

** Dateコンストラクタまたは* Date.parse *で文字列を解析しないでください(これらは構文解析では同等です)。 OPの形式は言語仕様(これは実装が不適切です)ではサポートされていません。常に手作業で文字列を解析します。ライブラリを使用することもできますが、この場合は2行の関数が必要です。この場合、文字列をISO-8601の日付として再フォーマットし、文字列を比較したり、Dateオブジェクトを作成することができます。 – RobG

関連する問題