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

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

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

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

Q&A

解決済

2回答

988閲覧

連想配列の表示で名前がかぶったら次に日付を見て一番新しいものを表示するプログラムを作りたい

wakaranchin

総合スコア15

JavaScript

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

0グッド

0クリップ

投稿2020/08/25 00:40

前提・実現したいこと

配列の氏名と日付の出力をしたいのですが、名前、日付が登録されている連想配列(これは連想配列で会ってますか?)を出力する際に名前がかぶっていた場合に一番新しい日付の配列のみを表示したいと考えています(少し文章がおかしいかもしれないですがすみません)。

HTMLでこのように表示したいです。
配列↓
array(7)[
0: {name: "田中", date: "2020-08-27"}
1: {name: "田中", date: "2020-08-07"}
2: {name: "坂下", date: "2020-08-19"}
3: {name: "坂下", date: "2020-07-30"}
4: {name: "吉田", date: "2020-07-31"}
5: {name: "山田", date: "2020-07-29"}
6: {name: "山本", date: "2020-07-29"}
]

列1列2
田中2020-08-27
田中2020-08-07
坂下2020-08-19
坂下2020-07-30
吉田2020-07-31
山田2020-07-29
山本2020-07-29

列1列2
田中2020-08-27
坂下2020-08-19
吉田2020-07-31
山田2020-07-29
山本2020-07-29

該当のソースコード

JavaScript

1 for (i = 0; i < array.length; i++) { 2 if (array[i] != array[i+1]) { 3 document.getElementById(x).value = array[i]["name"]; 4 document.getElementById(x).textContent = "【" + array[i]["name"] + "】 最終更新日【" + array[i]["date"] + "】"; 5 x+=1; 6 } else { 7 if (array[i]["name"] == array[i+1]["name"]) { 8 document.getElementById(i).textContent = "【" + array[i]["name"] + "】 最終更新日【" + array[i]["date"] + "】"; 9 } else { 10 date = array[i]["date"]; 11 while (0) { 12 x = i - 1; 13 if (array[i]["name"] == array[x]["name"]) { 14 var date1 = Date.parse(array[i]["date"]); 15 var date2 = Date.parse(array[x]["date"]); 16 if (date2 < date1) { 17 date = date1 18 } 19 } else { 20 document.getElementById(i).value = array[i]["name"]; 21 document.getElementById(i).textContent = "【" + array[i]["name"] + "】 最終更新日【" + date + "】"; 22 break; 23 } 24 i++ 25 26 } 27 } 28 } 29 }

試したこと

配列のループとIDへの挿入ループの考え方が分からず頭がパンクしてしまいどうやって書けばいいのかわからなくなってしまいました。

多次元の配列をあまり扱ったことがなくボロボロのコードだとは思いますが修正、一気に変えても構いません、ご指摘お願いします。

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

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

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

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

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

guest

回答2

0

効率がいいとは言い難いですがnameで絞った上でreduceを使う方法はどうでしょうか?

javascript

1const array = [ 2 {name: "田中", date: "2020-08-27"}, 3 {name: "田中", date: "2020-08-07"}, 4 {name: "坂下", date: "2020-08-19"}, 5 {name: "坂下", date: "2020-07-30"}, 6 {name: "吉田", date: "2020-07-31"}, 7 {name: "山田", date: "2020-07-29"}, 8 {name: "山本", date: "2020-07-29"} 9]; 10// 名前の配列を取得 11let nameArray = array.map((obj) => obj.name); 12// 名前の重複を削除 13nameArray = Array.from(new Set(nameArray)); 14 15// 処理結果格納用の配列 16let result = []; 17 18// 名前の配列をループ 19nameArray.map((currentName) => { 20 // 対象の名前のデータのみを抽出 21 const filterdArray = array.filter((obj) => obj.name === currentName); 22 // reduceで最も新しい日付を取得 23 const latestDate = filterdArray.length > 1? filterdArray.reduce((a,b) => a.date > b.date? a.date : b.date) : filterdArray[0].date; 24 // resultに格納 25 result.push({name : currentName, date : latestDate}); 26}); 27 28console.log(result); 29

投稿2020/08/25 01:35

nekoniki

総合スコア2411

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

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

nekoniki

2020/08/25 01:35

既に解決済みでしたか。 失礼しました。
guest

0

ベストアンサー

そういう時は、sortメソッドと、filterメソッド、findIndexメソッドをうまく使うといけるかと。

javascript

1const arr = [ 2 {name: "田中", date: "2020-08-27"}, 3 {name: "田中", date: "2020-08-07"}, 4 {name: "坂下", date: "2020-08-19"}, 5 {name: "坂下", date: "2020-07-30"}, 6 {name: "吉田", date: "2020-07-31"}, 7 {name: "山田", date: "2020-07-29"}, 8 {name: "山本", date: "2020-07-29"} 9]; 10 11const newArr = arr.sort((a, b) => { 12 if ( (new Date(a.date)) > (new Date(b.date)) ) { 13 return -1; 14 } else if ((new Date(a.date)) < (new Date(b.date))) { 15 return 1; 16 } else { 17 return 0; 18 } 19}).filter((v1, i1, a1) => 20 a1.findIndex(v2 => v1.name == v2.name) == i1 21); 22 23console.log(newArr);

まず、sortによって、日付の大きい順に並べ替えます。
そして、filterと、findIndexによって、同じ添字の同じ値を持つオブジェクトを丸めます。

他にも、reduceメソッドとかでもやれるかと思います。

そして、もっとスマートな方法があるかも。

投稿2020/08/25 01:24

miyabi_takatsuk

総合スコア9555

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

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

wakaranchin

2020/08/25 01:32

一生懸命for文で回していた自分がバカでした。。。 こんな便利なものがあるのですね!もっと勉強します!!
miyabi_takatsuk

2020/08/25 01:44

いや、forで回す考え方は基本で、その考え方をすることは第一歩なのですごく大事ですよ。 その上で、配列処理には便利なメソッドがあるんだーってことを覚えればよいかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問