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

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

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

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

JavaScript

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

Q&A

解決済

2回答

829閲覧

forEachで取得した値の加算

teddy1121

総合スコア44

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

JavaScript

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

0グッド

0クリップ

投稿2021/09/13 08:51

編集2021/09/15 08:40

前提・実現したいこと

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/ツールのバージョンなど)

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

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

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

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

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

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

guest

回答2

0

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

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

javascript

1for (element of dateList) { 2 db.collection("users").doc(userId).collection("time").doc(element).get().then((snapshot)=>{ 3 4 if (snapshot.data() !== undefined) { 5 6 scores = snapshot.data().toMinutes; 7 8 //ここに式を入れればいいと思ったのですが… 9 //以下は色々試したなかの一つです。 10 11 let result = [scores]; 12 let total = result.reduce(function(sum, element){ 13 return sum + element; 14 }, 0); 15 console.log(total) 16 //ここまで 17 18 } else { 19 20 } 21}

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

投稿2021/09/13 10:59

編集2021/09/15 12:40
takasima20

総合スコア7464

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

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

teddy1121

2021/09/15 02:34

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

2021/09/16 01:12

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

0

ベストアンサー

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

js

1const a = [1, 2, 3]; 2 3let res = 0; 4 5a.forEach((v) => { 6 res = res + v; 7}); 8 9 10console.log(res); // 6 11

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

js

1 2let res = a.reduce((v, e) => { 3 return v + e; 4}, 0); 5 6console.log(res); // 6

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

追)

js

1for (var d = startDate; d <= endDate; d.setDate(d.getDate() + 1)) { 2 var formatedDate = 3 d.getFullYear() + "" + (d.getMonth() + 1) + "" + d.getDate(); 4 5 dateList.push(formatedDate); 6} 7 8console.log(dateList); // month.html 78 9 10const getTotalOfMonth = (dateList) => { 11 let totalOfMonth = 0 12 13 dateList.forEach((date) => { 14 db.collection("users").doc(userId).collection("time").doc(date).get().then((snapshot) => { 15 16 if (snapshot.data() !== undefined) { 17 scores = snapshot.data().toMinutes; 18 19 // ここに式を入れればいいと思ったのですが… 20 // 以下は色々試したなかの一つです。 21 22 let result = [scores]; 23 24 let totalOfDate = result.reduce(function (sum, element) { 25 return sum + element; 26 }, 0); 27 28 totalOfMonth = totalOfMonth + totalOfDate; 29 30 console.log(total); // month.html 92 31 32 } else { 33 } 34 }); 35 }); 36 return getTotalOfMonth 37}; 38 39console.log(getTotalOfMonth(dateList))

投稿2021/09/13 09:30

編集2021/09/15 03:30
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

teddy1121

2021/09/13 09:40

ご返答ありがとうございます!説明が下手で申し訳ありません。 具体的にいくと、"dateList"で今回の場合202191~2021930という形で日付を呼び出しています。 その値を元にfirestoreからデータのある日付を抽出し、その日にある分数を取得しています。 コンソール画面には分数が縦に並びます。 配列も調べたのですが、取得した分数を配列内[]に格納する方法がわからず… ご提案頂いた方法が今試せないので後でトライしてみます! どう質問したら伝わるかもわからずすみません…
teddy1121

2021/09/15 02:23

返信遅くなり申し訳ありません。 質問部分を編集しました。 console.log(total)は画像のmonth.html:92です。 コンソールには画像のように分数が出るのですが、これを配列にすればいいと思ったのですが違いますか? ご提案頂いた内容だとv,eの部分がこれに当たるのかと思ったのですが、値をv,eに入れる方法がわりません。 本当に初歩的な内容かと思うのですがご教示頂けたら幸いです。
退会済みユーザー

退会済みユーザー

2021/09/15 03:31

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

2021/09/15 08:15

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

2021/09/15 08:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問