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

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

ただいまの
回答率

87.61%

forEachで取得した値の加算

解決済

回答 2

投稿 編集

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

score 3

前提・実現したいこと

forEachで取得した値を加算して合計を求めたいです。

発生している問題・エラーメッセージ

firestoreから抽出したデータは表示されます。(該当の日付にあるデータ)
consoleで確認するとforEachで取得できたデータが順に表示されます。
色々ググって試しましたが、合計を出すことができませんでした。

該当のソースコード

for(var d = startDate; d <= endDate; d.setDate(d.getDate()+1)) {
  var formatedDate = d.getFullYear()+""+(d.getMonth()+1)+""+d.getDate();

  dateList.push(formatedDate);

}

dateList.forEach(function(element){
 db.collection("users").doc(userId).collection("time").doc(element).get().then((snapshot)=>{

      if(snapshot.data() !== undefined){

        scores = snapshot.data().toMinutes;
    
    //ここに式を入れればいいと思ったのですが…
    //以下は色々試したなかの一つです。

        let result = [scores];
        let total = result.reduce(function(sum, element){
          return sum + element;
        }, 0);
console.log(total)
    //ここまで

      }else{~~~

(追記:kis9aさんに教えて頂いたコード)
for (var d = startDate; d <= endDate; d.setDate(d.getDate() + 1)) {
var formatedDate =
d.getFullYear() + "" + (d.getMonth() + 1) + "" + d.getDate();

dateList.push(formatedDate);
}

console.log(dateList); // month.html 78

const getTotalOfMonth = (dateList) => {
let totalOfMonth = 0

dateList.forEach((date) => {
db.collection("users").doc(userId).collection("time").doc(date).get().then((snapshot) => {

if (snapshot.data() !== undefined) {
scores = snapshot.data().toMinutes;

// ここに式を入れればいいと思ったのですが…
// 以下は色々試したなかの一つです。

let result = [scores];

let totalOfDate = result.reduce(function (sum, element) {
return sum + element;
}, 0);

totalOfMonth = totalOfMonth + totalOfDate;
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
//追加
let array1 = [];
array1.push(totalOfMonth)
console.log(array1) 
★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆
} else {
}
});
});
return getTotalOfMonth
};

console.log(getTotalOfMonth(dateList))

イメージ説明
上記イメージにあるようにコンソールには表示されます。

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

初歩的な内容かもしれないのですが、私の検索能力では限界だったのでお助け頂けると助かります。よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

すみません内容が少し分かりにくいです。
タイトル通りの意味だと下のように思いますし。

const a = [1, 2, 3];

let res = 0;

a.forEach((v) => {
  res = res + v;
});


console.log(res); // 6

例にあるようにArray.reduceを使って合計を求めることもできると思います。

let res = a.reduce((v, e) => {
  return v + e;
}, 0);

console.log(res); // 6

どの変数にどのような値が入っているのかを具体的にしていただくか、
もう少し、コードを抽象化して返信いただけますか?
エラーが出ているのであればエラーのメッセージも共有していただけますか?

追)

for (var d = startDate; d <= endDate; d.setDate(d.getDate() + 1)) {
  var formatedDate =
    d.getFullYear() + "" + (d.getMonth() + 1) + "" + d.getDate();

  dateList.push(formatedDate);
}

console.log(dateList); // month.html 78

const getTotalOfMonth = (dateList) => {
  let totalOfMonth = 0

  dateList.forEach((date) => {
    db.collection("users").doc(userId).collection("time").doc(date).get().then((snapshot) => {

        if (snapshot.data() !== undefined) {
          scores = snapshot.data().toMinutes;

          // ここに式を入れればいいと思ったのですが…
          // 以下は色々試したなかの一つです。

          let result = [scores];

          let totalOfDate = result.reduce(function (sum, element) {
            return sum + element;
          }, 0);

          totalOfMonth = totalOfMonth + totalOfDate;

          console.log(total); // month.html 92

        } else {
        }
      });
  });
  return getTotalOfMonth
};

console.log(getTotalOfMonth(dateList))

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2021/09/15 12:31

    配列に格納する場合。forEachの外で空の配列の変数を用意して、Array.push() すればどうでしょうか?

    キャンセル

  • 2021/09/15 17:15

    遅くなり申し訳ありません。
    はい、155+289+という形で対象期間内の日ごとの分数を合計して1か月の総計を出したいです。
    追記頂いた文をそのままコピペすると「console.log(getTotalOfMonth(dateList))」には「(datelist) =>{」以降のコードがそのまま表示されます。コピペの仕方が違うのでしょうか?
    自分でもいろいろ弄ってみますが併せてご教授いただければ幸いです。

    キャンセル

  • 2021/09/15 17:43

    kis9aさんに教えて頂いたようにArray.push()で配列にtotalOfMonthを追加したら合計数を取得できました!
    この方法があっているのかわかりませんが、とりあえず動いたのでkis9aさんをベストアンサーにさせて頂きます!教えて頂きありがとうございました。もしより良い方法があれば教えて頂けたら嬉しいです!

    キャンセル

+1

forEach で指定するのはコールバックですからね。

素直に for (x of dateList) { ... } 使えば?
--- 追記 ---
コールバックではループで使用する「関数」を指定しますから、ループの中と外では参照/更新できるものとできないものがあるので、そのへん慎重にコーディングする必要があります。
一方、上記を使えばそのような制限はないので手軽にコードを書けます。

for (element of dateList) {
    db.collection("users").doc(userId).collection("time").doc(element).get().then((snapshot)=>{

        if (snapshot.data() !== undefined) {

            scores = snapshot.data().toMinutes;

            //ここに式を入れればいいと思ったのですが…
            //以下は色々試したなかの一つです。

            let result = [scores];
            let total = result.reduce(function(sum, element){
                return sum + element;
                }, 0);
            console.log(total)
            //ここまで

      } else {

      }
}


たとえば、ループ内で計算した値を集計したいならば、ループ前に初期化してループ内で順次集計すればいいだけです。
ちなみに、全角空白がまじってるので半角空白に修正した方がいいと思います。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2021/09/15 11:34

    ご回答ありがとうございます。
    「for of datalist」
    でググったのですが私の理解が追い付かずやり方がわかりませんでした。
    例などを見せて頂けたら有難いです。
    お手数をおかけして申し訳ありませんがよろしくお願いします。

    キャンセル

  • 2021/09/16 10:12

    ご回答ありがとうございます。
    全角と半角…
    お恥ずかしい‥
    修正したいと思います。
    ご提案頂いたコードも試してみたいと思います。
    ご丁寧にありがとうございました!

    キャンセル

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

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

関連した質問

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