🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

2921閲覧

useStateに配列を入れたい&それをfor文を組み合わせて実現したいです

ssasq

総合スコア1

Next.js

Next.jsは、Reactを用いたサーバサイドレンダリングなどを行う軽量なフレームワークです。Zeit社が開発しており、nextコマンドでプロジェクトを作成することにより、開発環境整備が整った環境が即時に作成できます。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/03/21 11:05

編集2021/03/21 11:06

以下のコードのどこを修正すれば、希望通りの配列データが作れるでしょうか?

<現状>
newScoresが
[1][2][3][4][5][6][7][8]][9]...という感じになってしまってます...

<希望>
newScoresを
[1,2,3,4,5,7,8,9]という感じに一つの配列にしたいです!

react

1import firebase from "../../firebase"; 2import { useState, useEffect } from "react"; 3 4 5const RealTimeScore = () => { 6 const [newScores, setNewScores] = useState([]); 7 8 useEffect(() => { 9 const db = firebase.firestore(); 10 11 12 db.collection("users") 13 .get() 14 .then((snap) => { 15 16 17 console.log(snap.docs.length); 18 //ここは67 19 20 for (let index = 0; index < snap.docs.length; index++) { 21 const scores = snap.docs[index].data().score; 22 23 setNewScores([...newScores, scores]); 24 } 25 }); 26 }, []); 27 28 {console.log(newScores)}

このnewScoresの結果を[1,2,3,4,5,7,8,9]という感じに一つの配列にしたいです!
現状は、[1][2][3][4][5][6][7][8]][9]...という感じになってしまってます...

<補足情報>
以下の値は、配列ではなく、単体の数値です。

console.log(snap.docs[0].data().score);

//この値は「12」配列ではなく、一つの数値が入ってます
上記以外も、

docs[n].data.score()

は全て、単体の数値が入ります。
これらを、配列にしたい感じです!

お手数ですが、わかる方。お力添えいただければ幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

for ループの中で setNewScores([...newScores, scores]); して newScores に追加しているつもりだと思いますが、useState の setter で値を更新しても即時 state に反映されるわけではない のでうまくいきません。

for ループを使うなら次のようにすると良いでしょう。

js

1 const scores = []; 2 for (let index = 0; index < snap.docs.length; index++) { 3 scores.push(snap.docs[index].data().score); 4 } 5 setNewScores(scores);

または、map を使って一行で書くこともできます。

js

1 setNewScores(snap.docs.map(doc => doc.data().score));

投稿2021/03/21 20:15

hoshi-takanori

総合スコア7899

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

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

ssasq

2021/03/22 22:10

ご丁寧な回答ありがとうございました!処理、両方とも試してみて希望通りの動きが実現できました!とても助かりました????‍♂️
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問