質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • JavaScript

    16461questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Javascriptの配列を範囲指定しソートし新しいもの順に並び替えたい

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 255

k0908

score 82

var time = [["Tom", 34, "2009-04-26 10:14,49"], ["Bob", 29, "2015-12-16 17:32:40"], ["John", 31, "2014-11-21 04:16:37"], ["Lucy", 13, "2010-06-01 04:38:49"], ["Kei", 53, "2011-08-23 17:17:24"], ["Emma", 47, "2014-03-25 09:39:59"]]


というtime配列がある。

var starttime ="2012-01-14 10:30:00"
var endtime ="2015-06-26 10:00:00"


という2つの変数があり、このstarttime変数〜endtime変数までの間で
time配列の要素を絞り新しい順に配列の要素を並び替えたい。

理想のアウトプットは、

var time = [["John", 31, "2014-11-21 04:16:37"],["Emma", 47, "2014-03-25 09:39:59"]] 


のような配列を出力することである。

var time =time.slice(starttime, endtime)


とコードを書いたが理想のアウトプットにならなかった。
どのようにコードを書けばいいのか?どう修正すればいいのか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

var time = [["Tom", 34, "2009-04-26 10:14,49"], ["Bob", 29, "2015-12-16 17:32:40"], ["John", 31, "2014-11-21 04:16:37"], ["Lucy", 13, "2010-06-01 04:38:49"], ["Kei", 53, "2011-08-23 17:17:24"], ["Emma", 47, "2014-03-25 09:39:59"]];
var starttime ="2012-01-14 10:30:00";
var endtime ="2015-06-26 10:00:00";
var newtime=JSON.parse(JSON.stringify(time)).filter(function(x){
  return x[2]>=starttime && x[2]<=endtime;
}).sort(function(x,y){
  return x[2]==y[2]?0:(x[2]<y[2]?1:-1);
});
console.log(newtime);

 追記

JSON.parse(JSON.stringify(・・・))について質問がありましたので以下参考にして下さい

var a=[[100,110,120],[200,210,220],[300,310,320]];
var b=a.filter(function(x){return x[1]==210;})[0];
console.log(b);
b[0]=999;
console.log(b);
console.log(a);


javascriptにおいて変数へのオブジェクトの代入は常に参照渡しをします。
上記、aの配列から2番目(0から数えて1番め)の要素が210の配列を1つbに受けたとして
bの1番め(0から数えて0番目)の要素を変更すると、元のaの配列にも影響があるわけです
これを避ける常套手段としてオブジェクトの属性からはずすために
一度文字列化をしてオブジェクトにもどすJSON.parse、JSON.stringifyを利用します

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/23 12:52

    解決後に横からすみません。↓の部分はなくても動作しそうですが、意図を教えてもらってもいいですか?

    JSON.parse(JSON.stringify(time))

    質問を立てる必要があれば、そのようにいたしますのでご指示ください。

    キャンセル

  • 2018/05/24 11:18

    TO:Lhankor_Mhyさん
    ご質問の件、追記しておきました。
    これでわかりますか?

    キャンセル

  • 2018/05/24 12:45

    ありがとうございます。
    よくわかりました。破壊的操作をしていることをすっかり失念していました。

    キャンセル

+1

配列の要素を絞るにはfilterメソッドを使うとよい。
Array.prototype.filter() - JavaScript | MDN

時刻文字列の解釈が問題だが、幸いにしてDateオブジェクトがパース可能な形式のようなので、new Date("2009-04-26 10:14:49")のようにすればよい。ただし、ISO-8601書式とは異なるので、ブラウザ実装依存であるから、対応ブラウザにはご注意いただきたい。
また、Dateオブジェクトは大小比較が可能であるから、フィルタ関数についても問題なく記述できる。

新しい順に配列の要素を並び替えるには、sortメソッドを使えばよい。
Array.prototype.sort() - JavaScript | MDN

不明な点はコメントいただきたい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

var time =time.slice(starttime, endtime)
とコードを書いたが理想のアウトプットにならなかった。

とありますが、そもそもsliceの使い方見てから使うべきですね。
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/slice
sliceに指定する引数は 配列のindexです。

求めるものを得るには、以下の関数を使用することで実装できると思います。

  1. 配列からある条件のものを抽出するには
    Array.prototype.filter()
  2. 配列をソートするには
    Array.prototype.sort()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    AWSのCloudWatchのAuto Scalingのメトリクスの取得方法について

    前提・実現したいこと AWS CLIを実行するbashスクリプトを作成し、その実行結果をZabbixで取り込み、AWSのオートスケールのインスタンス数を監視したいと思っています。

  • 解決済

    AndroidのSurfaceViewの描画が遅い

    現在アンドロイドアプリで円が放射運動をするSurfaceViewの開発をしたのですが、FPSが低すぎて、ボールが滑らかに運動しているように見えなくて困っています。 あまりAn

  • 解決済

    javascript ストップウォッチを作る

    前提・実現したいこと 現在ドットインストールを見ながらストップウォッチを作成中です。しかし、今までうまく動いていたのに、急にボタンを押してもストップウォッチのスタートボタンを押し

  • 解決済

    プルダウンメニューが思った動きをしてくれない

    <ul class="nav"> <li><a href="#" class="nav-item">あ</a></li> <li><a href="#" class="na

  • 解決済

    関数の定義と呼び出しの記述について

    実現したいこと スタートボタンを押すとpairsで定義した全ての枚数のカードが裏返しになる。 現状 スタートボタンを押しても何も変化なし。 ソースコード html <!

  • 解決済

    タイマーアプリの作成

    前提・実現したいこと スタート、ストップ、リセットのあるストップウォッチを作りたいのです ストップのあとスタートを押した際に、続きから計測できるようにしたいです 発生している問

  • 解決済

    python selenium でgoogleにログインする方法

    タイトルの通りなのですが、 login_id = 'id' pas = パス driver.get('https://accounts.google.com') time.

  • 解決済

    jquery カウントダウンタイマー

    ネットで調べた以下のコードをカスタマイズしていますがうまく動かなくて困っています。 変更したい点は 指定した日時に向けてカウントダウンする ↓ ページにアクセスした時点から10

同じタグがついた質問を見る

  • JavaScript

    16461questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。