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

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

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

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

React.js

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

Q&A

解決済

1回答

1423閲覧

jsのswitch文を使い配列に要素を追加したい

daaaiki

総合スコア4

JavaScript

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

React.js

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

0グッド

0クリップ

投稿2021/04/12 06:03

家計簿アプリを作成していて、firestoreから取り出した配列からreact-chartjs-2のデータ、ラベル用にswitch文を使って新しい配列を作成して、要素を追加、変更していきたいのですが、思ったように動作しません。

//firestoreからのデータ 0: {id: "G4yoFNKPrHm1FhjGsG5h", categorie: "携帯代", expense: "2222", timestamp: "2021/4/9"} 1: {id: "Z4cENBMt5I8ty4cy0DnV", categorie: "携帯代", expense: "7777", timestamp: "2021/4/9"} 2: {id: "h6QiqVjSdV9Fwz2YvSxt", categorie: "携帯代", expense: "6000", timestamp: "2021/4/9"} 3: {id: "qT3ypMX0xJTokjnPwQKn", categorie: "携帯代", expense: "5000", timestamp: "2021/4/9"} 4: {id: "rdnD4THmmhRv2mIhWRiS", categorie: "携帯代", expense: "3333", timestamp: "2021/4/9"} 5: {id: "vcZkkp4lAVpxT9MN50n3", categorie: "携帯代", expense: "6000", timestamp: "2021/4/9"}
import React,{useEffect,useState} from 'react' import {Bar} from 'react-chartjs-2' import {useHistory} from 'react-router-dom' import {PROPS} from './Index' const Chart:React.FC<PROPS> = ({chartdata}) => { const [label,setLabel] =useState<string[]>([""]) const [sum,setSum] =useState<number[]>([]) const history=useHistory() const handleChangeIndex=()=>{ history.push('/') } useEffect(()=>{ chartdata.map((doc,index)=>{ const dateLabel=doc.timestamp for(let i=0;i<label.length;i++){ switch(label[i]){ case "": setLabel([dateLabel]) const newVal=Number(doc.expense) setSum([newVal]) console.log(label,sum) break; case dateLabel: const val=sum.slice() const value=val[index] val[index]=value+Number(doc.expense) setSum(val) console.log(label,sum) break; default: const labelarray=label.slice() labelarray.push(dateLabel) setLabel(labelarray) const addVal=Number(doc.expense) const addSum=[...sum,addVal] setSum(addSum) console.log(label,sum) break; } } }) },[]) const graphData={ labels:label, datasets:[ { data:sum } ] } return ( <div className="container"> <a className="index-button" onClick={handleChangeIndex}>index</a> <div className="data-graph"> <Bar data={graphData} /> </div> </div> ) } export default Chart

予想だと、マウントしたら、switch文で、case"": に入り、labelに登録日の入った新しい配列が追加され、breakで終了する。
次の要素が呼ばれ、同じ登録日の場合、case dateLabel: に入り、違った場合、case default: に入り、要素を追加、変更になる。
だとおもいましたが、
結果のstateはlabelが[2021/4/9] sumが[6000]でした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

そもそもswitchを使っているのが可読性が悪く、何がしたいかもわかりにくく、バグの温床になっています。
やりたいことはtimestampによるgroup byとexpenseのsumだと思うので下のコードなどどうでしょう?

javascript

1 2const sums = new Map<string,number>(); 3chartdata.forEach(doc => { 4 sums[doc.timestamp] = sums.get(doc.timestamp, 0) + doc.expense; 5}) 6 7console.log(sums["2021/4/9"]); 8// 30332 9 10setLabels(Array.from(sums.keys)); 11setSums(Array.from(sums.values)); 12

投稿2021/04/12 12:43

takezoux2

総合スコア6

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

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

daaaiki

2021/04/13 03:46

とてもすっきりした書き方ができるんですね!勉強になりました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問