2016-12-11 6 views
6

この質問を検索しましたが、既存の回答は適用されません。次のことを考えてみましょう:キーが日付であるオブジェクトの配列を並べ替える方法

[ 
    { 'August 17th 2016': [75] }, // 75 is the length of the array which contains up to 75 objects ... 
    { 'August 1st 2016': [5] }, 
    { 'August 28th 2016': [5] }, 
    ... 
] 

その日付で、この配列内のオブジェクトをソートし、まだ彼らのキーの「英語」の表現を維持するための最良の方法は何ですか?

:キーはチャートラベルとして使用されます。

どこでも私はarray.sortを使っていますが、これはオブジェクトのキーcreated_atにあります。

結果は次のようになります。

[ 
    { 'August 1st 2016': [5] }, 
    { 'August 17th 2016': [75] } 
    { 'August 28th 2016': [5] }, 
    ... 
] 

私はので、私はショーには何もありません続行するかどうかはわかりません。

+0

おそらく重複ですか? http://stackoverflow.com/questions/979256/sorting-an-array-of-javascript-objects – tbg

+0

[ネストされたオブジェクトの配列を日付順にソートする]の可能な複製(http://stackoverflow.com/questions/9293290/sorting) -nested-objects-by-date) – Shaffanhoon

+2

どちらもキーでソートしたいので、どちらも正しい複製ではありません。 –

答えて

6

これは、オブジェクトキーにdate.parseを使用することによって達成できます。最初のオブジェクトキーは配列の各エントリに1つしかないように見えます。難しい部分は、date.parseが "12th"または "1st"では機能しないため、一時的に "th"または "st"を,に置き換えなければならないということです。このようにして、date.parseは文字列に作用します。

var dates = [{ 
 
    'August 17th 2016': [75] 
 
}, { 
 
    'August 1st 2016': [5] 
 
}, { 
 
    'August 28th 2016': [5] 
 
}] 
 

 
const replaceOrdinals = o => { 
 
    return Object.keys(o)[0].replace(/\w{2}(\d+$)/, ',$1'); 
 
} 
 

 
dates = dates.sort((a, b) => { 
 
    return Date.parse(replaceOrdinals(a)) - Date.parse(replaceOrdinals(b)) 
 
}); 
 

 
console.log(dates);

を覚えておいてください:

@adeneoからのコメントで:Date.parseはimplentation依存しています。タイムゾーンのようなものが物事を混乱させるかどうかを判断するために、ドキュメントを読むことをお勧めします。より確実な方法として、date parsingのためにmoment.jsのようなものを使うことができます。

+1

'Date.parse'は実装依存であり、実装によってはこれらの日付文字列ではまったく動作しません。 – adeneo

+0

これについて説明できますか? 'replaceOrdinals = o =>'ここで何をしていますか? @KevBot – TheWebs

+0

@ TheWebs、それは['arrow function'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)です。 ES5のバージョンは 'var replaceOrdinals = function(o){...}'です。この場合、引数は1つしか必要ないので、 '()'は 'o 'の周りでは必要ありません。 '=>'は構文の一部に過ぎませんが、直後に中括弧を使用するかどうかによっていくつかの違いがあります。それらのことはそのリンクで説明されています。それはあなたの質問に答えますか? – KevBot

0

answer by Kevbotのソリューションはエレガントですが、そのアプリケーションは、OPで使用される特定の日付形式に準拠するdate.parse()の実装のES6ブラウザに限定されています。

var dates = [ 
 
    {'August 17th 2016': [75]}, 
 
    {'August 1st 2016': [5]}, 
 
    {'August 28th 2016': [5]} 
 
]; 
 

 
dates.sort(function(a, b){ 
 
    var i, j; 
 
    for(i in a); //get datestring a 
 
    for(j in b); //get datestring b; 
 
    return MMMDDYYYYtoSortableNumber(i) - 
 
    MMMDDYYYYtoSortableNumber(j); 
 
}); 
 

 
console.log(dates); 
 

 
// MMMDDYYYYtoSortableNumber() converts datestrings 
 
// such as "April 5th 1969" to 19690405. 
 
// Month name to digit approach adapted from 
 
// https://gist.github.com/atk/1053863 
 
    
 
function MMMDDYYYYtoSortableNumber(datestring) { 
 
    var mdy = datestring.match(/\w(\w\w)\D+(\d+)\D+(\d+)/); 
 
    return mdy[3] * 10000 + 
 
    ' anebarprayunulugepctovec'.search(mdy[1]) * 50 + 
 
    mdy[2] * 1; 
 
}
:代わりにちょうど date.parse()依存することを避けるため、このような moment.jsとしてライブラリを追加するので

、(古いブラウザを含む)任意のJavaScript環境で動作しますテーラードソリューションは、わずか数行のコードで作成することができます

オブジェクトの値ではなく、オブジェクトキーとしてdatestringsを表現する方が安全かもしれないことに注意してください。彼らは安全に(そしてより速くアクセスするために)簡単に抽出することができます。例えば。

{label: 'August 17th 2016', data: [75]}, 
関連する問題