JavaScript 配列値の比較でもっとスマートなやり方がないか検討したい

実現したいこと

多次元配列と配列の値をそれぞれ取り出して処理する際に自分の考えたコードでやりたいことは実現できているが、Foreachやfilterなどを使ってやるのが普通だと思うがそのやり方が分からない

前提

最高でも7つの要素しか持たない多次元配列 weekObjs(data,moodscore,memoというキーを持つ)と直近一週間の日付が格納された配列weeks(要素数7個)があります。
二つの配列の要素を頭からそれぞれ取り出し日付が同じだったらweekObjsのその日のmoodscoreの値を別の配列trueweekscoreに入れ
日付が合わなかったらnullをtrueweekscoreに追加したいです。
それを実現しようとして、forループを書きましたが、weekObjsの要素数が7以下だとエラーになるため。7未満の場合はダミーデータを入れ対処しましたがベターなやり方はないでしょうか。

該当のソースコード

index.html

1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>Document</title> 7</head> 8<body> 9 <script> 10 // 最高でも直近一週間分しか入らない配列 11 var weekObjs=[{date: '2023/11/14', moodscore: 90, memo: 'ffc', id: 195},{date: '2023/11/15', moodscore: 80, memo: 'ff', id: 195},{date: '2023/11/16', moodscore: 50, memo: '', id: 195}]; 12 console.log(weekObjs.length); 13 14 15 // 直近一週間の月と日付を取得して配列 weeksを作成 16 17var date = new Date(); 18var weeks = []; 19for (var i = 0; i < 7; i++) { 20 var before = new Date(); 21 before.setDate(date.getDate() - i); 22 weeks.push(before.getFullYear()+'/'+(+before.getMonth() + 1)+'/' + before.getDate()); 23 } 24weeks=weeks.reverse(); 25 26 27 // 直近一週間のスコアを入れる配列trueweekscoreを用意 28 var trueweekscore=[]; 29 30// 配列weekObjsの要素の数が7未満の時、足りない分だけ配列の先頭にダミーデータを入れる 31 var weekObjsCount=weekObjs.length; 32 if(weekObjsCount<7){ 33 for(var i = 0; i < (7-weekObjsCount); i++){ 34 weekObjs.unshift("ダミー"); 35 36 } 37 } 38 39 console.log(weekObjs); 40 for (var i = 0; i < weeks.length; i++) { 41 console.log('%s-%s', weeks[i], weekObjs[i].date) 42// 二つの配列の値(日付)を比較して同じだったら配列trueweekscoreにその値(日付)と同じ要素内のmoodscoreを追加 43 if(weeks[i]==weekObjs[i].date){ 44 trueweekscore.push(weekObjs[i].moodscore); 45 }else{ 46 // 二つの配列の値(日付)を比較して違っていたら配列trueweekscoreにnullを追加 47 trueweekscore.push(null); 48 } 49 50 } 51 // 直近一週間分のスコアを取得 52 console.log(trueweekscore); 53// ⇒ [null, null, null, null, 90, 80, 50]が出力される 54 55 </script> 56</body> 57</html>

試したこと

forの中にifを入れたりしましたがおかしくなって失敗しました

補足情報(FW/ツールのバージョンなど)

vscodeで検証しています

コメントを投稿

0 コメント