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

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

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

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

TypeScript

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

Q&A

2回答

587閲覧

ある指定の同じキーの値を合算し、別の配列を生成する

SKSG

総合スコア19

JavaScript

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

TypeScript

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

0グッド

1クリップ

投稿2018/07/16 03:21

JavaScriptで、以下のような形でデータが入った連想配列にて、
同じキーの要素(今回の例では日付)のamountを合算し、
新しい配列を生成しなおすロジックを考えています。

例:元の5件の連想配列

var dataList = [data, data, data, data, data]; 0 : data {id: 100, date: "2018-06-10", amount: 124} 1 : data {id: 105, date: "2018-06-15", amount: 354} 2 : data {id: 120, date: "2018-07-01", amount: 217} 3 : data {id: 129, date: "2018-07-01", amount: 320} 4 : data {id: 131, date: "2018-07-01", amount: 140} 5 : data {id: 183, date: "2018-07-12", amount: 156}

※idは再度採番
※日付が同日のデータをamountを合算して以下の配列を生成

var newDataList = [data, data, data, data]; 0 : data {id: 1, date: "2018-06-10", amount: 124} 1 : data {id: 2, date: "2018-06-15", amount: 354} 2 : data {id: 3, date: "2018-07-01", amount: 677} 4 : data {id: 4, date: "2018-07-12", amount: 156}

filter, mapといったメソッドを使い色々試しているのですが、思い通りにいかず苦戦しています。
ご教授いただけないでしょうか。よろしくお願い致します。

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

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

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

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

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

kei344

2018/07/16 03:57

ご自身で試されたコードを質問文に追記し、「何」が「どのように」わからないのか、コードのどの部分で詰まっているのかなどを具体的に追記されたほうが回答が望めると思います。
SKSG

2018/07/17 12:32

> kei344様 遅くなり申し訳ありません。仰る通り、もう少し自身でトライしその結果コードのどこがどうわからないのか、解決しない場合追記したいと思います。コメントありがとう御座いました。
think49

2018/12/22 09:58

「新しい配列を生成しなおすロジックを考えています。」と書きながら、ロジックが全く書かれていないのが気になるところですね。 「filter, mapといったメソッドを使い色々試しているのですが、思い通りにいかず苦戦しています。」とありますが、ロジックをどう考えて、filter, map を使おうと思い至ったのでしょう?
guest

回答2

0

推測100%であえて書きますが、初心者の方は特に、ロジックを考える部分を適当なところで切り上げて、見切り発車で適当にコードを書き殴って「上手く動きません」と悩んでいる印象があります。
コードはただの成果物(結果)で、ロジック(経過)の方がよほど重要なのですが…。

JavaScript

1'use strict'; 2const dataList = [{id: 100, date: "2018-06-10", amount: 124}, {id: 120, date: "2018-07-01", amount: 217}, {id: 129, date: "2018-07-01", amount: 320}, {id: 131, date: "2018-07-01", amount: 140}, {id: 183, date: "2018-07-12", amount: 156}], 3 map = new Map; 4 5for (let data of dataList) { 6 const date = data.date, exist = map.get(date); 7 8 exist ? exist.amout += data.amount : map.set(date, data); 9} 10 11console.log(JSON.stringify([...map.values()])); // [{"id":100,"date":"2018-06-10","amount":124},{"id":120,"date":"2018-07-01","amount":217,"amout":null},{"id":183,"date":"2018-07-12","amount":156}]

このコードを見て「出来ました!」でクローズするか、「これはどういうロジックなのでしょう?」と疑問に思うか、が境界線だと私は思います。

Re: sak71g さん

投稿2018/12/22 10:04

編集2018/12/22 10:24
think49

総合スコア18164

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

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

0

パフォーマンスは変わらないので普通にループがおすすめです

javascript

1var keyList=[]; 2var newDataList=[]; 3for(var i=0;i<dataList.length;i++){ 4 var keyIndex=-1; 5 for(var n=0;n<keyList.length;n++){ 6 if(keyList[n]==dataList[i].date){ 7 keyIndex=n; 8 break; 9 } 10 } 11 if(keyIndex>=0){ 12 newDataList[keyIndex].amount+=dataList[i].amount; 13 }else{ 14 keyList.push(dataList[i].date); 15 newDataList[i].push({id: newDataList.length, date:dataList[i].date, amount: dataList[i].amount}); 16 } 17}

投稿2018/12/22 06:45

編集2018/12/22 07:32
bochan2

総合スコア2050

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問