お世話になっております。
javascript初心者です。
以下のような要素を時系列でsortするにはどうすればいいでしょうか?
<ul>
<li>テキストを時系列で並び替えたい 2011/05/15/19:00</li>
<li>テキストを時系列で並び替えたい 2009/01/15/14:00</li>
<li>テキストを時系列で並び替えたい 2010/05/15/19:00</li>
</ul>
liの中のテキストをArrayオブジェクトに代入して配列にした後
sortでどのような処理をすればいいのでしょうか?
例えば
var myArray = new Array();
でmyArrayと言う配列オブジェクトにliのテキストを代入したときに
myArray.sort(function(a,b) {return a-b;});
とすれば比較要素が単体数字の場合はソートできるのですが
文字と/など複合数字が混在しているとソートできません。
No.4ベストアンサー
- 回答日時:
そもそも、HTML を使っているのに、地の文と日付データをタグで区別できていない時点で致命的です。
HTML を書き換えられるなら、日付データを確実に区別しておくべきです。日付なのですから、Date オブジェクトで比較するのが確実です。<ul>
<li>テキストを時系列で並び替えたい <span class="time">2011/05/15/19:00</span></li>
<li>テキストを時系列で並び替えたい <span class="time">2009/01/15/14:00</span></li>
<li>テキストを時系列で並び替えたい <span class="time">2010/05/15/19:00</span></li>
</ul>
// version(160), ("Selectors-API", "1.0"), ("Core", "3.0")
Array.map (document.querySelectorAll ('ul:first-of-type > li > *.time:first-of-type'), function (time) {
// Date.parse() できる可能性の高い形式なので利用する
return { time: time, container: time.parentNode.parentNode, t: new Date (time.textContent) };
}).sort (function (o1, o2) {
return o1.t - o2.t;
}).forEach (function (o) {
o.C.appendChild (o.time.parentNode);
});
Date オブジェクトを作れる日付文字列は実装依存ですが、心配であれば <span title="2011/05/15 19:00"> のように機械処理可能な文字列を属性値にでも埋め込んでおけば良いでしょう。
どうしても HTML の方を修正できないのなら、日付部分を切り出します。どうせ切り出すのなら、確実に Date を作れるよう日付パラメータを切り出します。
<ul>
<li>テキストを時系列で並び替えたい 2011/05/15/19:00</li>
<li>テキストを時系列で並び替えたい 2009/01/15/14:00</li>
<li>テキストを時系列で並び替えたい 2010/05/15/19:00</li>
</ul>
Array.map (document.querySelectorAll ('ul:nth-of-type(2) > li'), function (li) {
var t = this.exec (li.textContent);
return { e: li, t: t ? new Date (t[1], t[2], t[3], t[4], t[5]) : NaN, L: li.parentNode };
}, /(\d{4})\/(\d{2})\/(\d{2})\/(\d{2}):(\d{2})/).sort (function (o1, o2) {
var t1 = o1.t, t2 = o2.t;
if (isNaN (t1)) return 1;
if (isNaN (t2)) return -1;
return o1.t - o2.t;
}).forEach (function (o) {
o.L.appendChild (o.e);
});
参考URL:http://www.unicode.org/reports/tr10/
No.3
- 回答日時:
日時が24時間法でゼロパディングされているなら、引数なしの Array.prototype.sort() でソートできるはずです。
(例示の配列はこの状態)var myArray = ['テキストを時系列で並び替えたい 2011/05/15/19:00', 'テキストを時系列で並び替えたい 2009/01/15/14:00', 'テキストを時系列で並び替えたい 2010/05/15/19:00'];
myArray.sort();
alert(myArray); // ["テキストを時系列で並び替えたい 2009/01/15/14:00", "テキストを時系列で並び替えたい 2010/05/15/19:00", "テキストを時系列で並び替えたい 2011/05/15/19:00"]
日時がゼロサプレスされていると困った結果になります。
var myArray2 = ['2011/5/15/19:00', '2011/1/15/14:00', '2011/10/15/19:00'];
myArray2.sort();
alert(myArray2); // ["2011/1/15/14:00", "2011/10/15/19:00", "2011/5/15/19:00"]
Array#sort は文字列を先頭から1文字ずつ走査していき、アドレスの小さな順に並び替えます。
"2011/1" と "2011/5" を比較すると前者が小さいので、"2011/10/15/19:00" は "2011/5/15/19:00" より前にソートされてしまいます。
http://www2u.biglobe.ne.jp/~oz-07ams/prog/ecma26 …
http://es5.github.com/#x15.4.4.11
myArray2 のパターンでソートするには「自然言語アルゴリズム」でソートする必要があります。
https://gist.github.com/660141
No.2
- 回答日時:
> myArray.sort(function(a,b) {return a-b;});
日時部分がうしろから16文字固定ならば、文字列比較でいけるので、
function(a,b) {return a-b;}
を
function(a,b){
return (a.slice(-16) > b.slice(-16)) ? 1 : -1;
}
に替えたらいけないですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- HTML・CSS インラインブロックの中のテキストを上下中央に合わせたい 1 2022/12/24 17:46
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- JavaScript html5に変えるとスライドショーが消えてしまった。 3 2022/03/26 19:53
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- HTML・CSS リストの並べ替え 1 2022/09/13 15:27
- Java Java 南京錠 2 2023/02/04 11:46
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カテゴリページ内 複数タブ
-
多階層ドロップダウンのスマホ...
-
ネストされたチェックボックス...
-
jQueryセレクタ/複数要素の指...
-
検索した後の最初の画面で、フ...
-
どの<li><a> が押されたか判別...
-
jqueryのプラグインflexslider...
-
タブメニューを上下に設置
-
ドロップダウンメニュー(?)の...
-
noscript内のリンク変更
-
Javascript テキストのみのSELECT
-
jqueryのsortableで一部ソート...
-
MAX関数を使ってからLEFT JOIN...
-
html5に変えるとスライドショー...
-
画像のスムーズなフェードイン方法
-
クリッカブルマップの一部分だ...
-
MFCで画像を表示させているので...
-
画像の重なりの順序を代える方...
-
表示する画像をファイル名を受...
-
ジャバスクリプト
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
jqueryのsortableで一部ソート...
-
「jQuery」アコーディオンメニ...
-
jQueryのeqで最後からn番目以降...
-
jquery ドロップダウンメニュー...
-
javascriptでフォーカスを当て...
-
クリックした<a>タグのみにClas...
-
タブ切り替えの初期表示について
-
Jquery の slide.toggle で要素...
-
jQuery タブメニューへのダイ...
-
大量のチェックボックス状態取...
-
javascriptでEnterキーをtabキ...
-
javascriptで、クリックしたら...
-
jQueryでネスト構造の<li>がク...
-
ネストされたチェックボックス...
-
展開メニューの修正
-
jQuery アコーディオンメニュー...
-
gridstack.jsについて教えてく...
-
jQueryのhide,showで中の要素が...
-
戻ってきた時ツリーメニューが...
-
フォントサイズの変更
おすすめ情報