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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

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

Q&A

解決済

3回答

2032閲覧

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

k0908

総合スコア102

JavaScript

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

0グッド

0クリップ

投稿2018/05/22 03:07

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)

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

javascript

1var 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"]]; 2var starttime ="2012-01-14 10:30:00"; 3var endtime ="2015-06-26 10:00:00"; 4var newtime=JSON.parse(JSON.stringify(time)).filter(function(x){ 5 return x[2]>=starttime && x[2]<=endtime; 6}).sort(function(x,y){ 7 return x[2]==y[2]?0:(x[2]<y[2]?1:-1); 8}); 9console.log(newtime);

追記

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

javascript

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

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

投稿2018/05/22 03:46

編集2018/05/24 02:17
yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2018/05/23 03:52

解決後に横からすみません。↓の部分はなくても動作しそうですが、意図を教えてもらってもいいですか? JSON.parse(JSON.stringify(time)) 質問を立てる必要があれば、そのようにいたしますのでご指示ください。
yambejp

2018/05/24 02:18

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

2018/05/24 03:45

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

0

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()

  1. 配列をソートするには

Array.prototype.sort()

投稿2018/05/22 03:28

euledge

総合スコア2404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

投稿2018/05/22 03:28

Lhankor_Mhy

総合スコア36115

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問