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

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

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

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

Q&A

解決済

2回答

944閲覧

JavaScriptで連想配列オブジェクトAの中で計算してその結果を連想配列オブジェクトBに条件指定して入れたいです。

hololiveyukimin

総合スコア5

JavaScript

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

0グッド

0クリップ

投稿2021/06/09 08:21

編集2021/06/09 08:27

JavaScriptで連想配列オブジェクトAの中でnum * priceしてvoucherSeqが同一の場合はその値を合計して、その結果を特定key(voucherSeq)の値が一致する連想配列オブジェクトBのtotalPriceに入れたいです。

状態としては以下の通りです。

該当のソースコード

JavaScript

1var A = [ 2 [num: 1,price:10,voucherSeq:1] 3 [num: 10,price:100,voucherSeq:1] 4 [num: 2,price:200,voucherSeq:2] 5 [num: 10,price:100,voucherSeq:2] 6 [num: 5,price:300,voucherSeq:3] 7 [num: 10,price:100,voucherSeq:3] 8 [num: 8,price:400,voucherSeq:3] 9]; 10 11var B = [ 12 [totalPrice:null,voucherSeq:1] 13 [totalPrice:null,voucherSeq:2] 14 [totalPrice:null,voucherSeq:3] 15]; 16 17求めたい結果 18var B = [ 19 [totalPrice:1010,voucherSeq:1] 20 [totalPrice:1400,voucherSeq:2] 21 [totalPrice:5700,voucherSeq:3] 22];

試したこと

voucherSeqが同一の場合のみ計算するということが現状できていません。
ただ、配列の中のすべてのnumとpriceを乗法して合計することはできています。
何かに使えるかわかりませんが、下に記載します。

//リストのkeyを元に該当keyだけで新規配列作成関数 var getValueWithKey = function(searchKey, hash) { var result = [], i = 0, len = 0; if (!searchKey || typeof searchKey !== 'string') return []; if (!hash || typeof hash !== 'object') return []; if (hash[searchKey]) { result.push(hash[searchKey]); } else { for (i = 0, len = hash.length; i < len; i++) { if (hash[i] && hash[i][searchKey]) { result.push(hash[i][searchKey]); } } } return result; }; //下記の場合、配列Aのnumだけでリスト作成 var num = getValueWithKey('num', A); var price = getValueWithKey('price', A); //新規配列作成 const sum =[]; //配列のインデックス番号を元に配列sumに乗算値でプッシュ for (let i = 0; i < num.length; i++) { sum.push(num[i] * price[i]) } //配列sumの合計値を算出 var sumTotalPrice = sum.reduce(function(a,b){ return Number(a) + Number(b); });

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

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

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

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

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

K_3578

2021/06/09 08:29 編集

java scriptではなくJavaScriptです。 追記 言語名を間違えているとcode機能の言語名の所も表示されないので、 こういう細かいところから気にするようにした方が良いです。 1文字タイプミスしただけで動かなくなったりする世界なので。
hololiveyukimin

2021/06/09 08:41

ご指摘ありがとうございます。 修正いたしました。
K_3578

2021/06/09 08:53

>hololiveyukiminさん 修正ありがとうございます。
guest

回答2

0

ベストアンサー

ABの書き方がおかしい(オブジェクトなのに[]で記載されていたり、要素間のカンマがなかったり)などツッコミどころはいくつかありますが、やりたいことは下記のような感じでしょうか?

js

1var A = [ 2 {num: 1,price:10,voucherSeq:1}, 3 {num: 10,price:100,voucherSeq:1}, 4 {num: 2,price:200,voucherSeq:2}, 5 {num: 10,price:100,voucherSeq:2}, 6 {num: 5,price:300,voucherSeq:3}, 7 {num: 10,price:100,voucherSeq:3}, 8 {num: 8,price:400,voucherSeq:3}, 9]; 10 11var B = [ 12 {totalPrice:null,voucherSeq:1}, 13 {totalPrice:null,voucherSeq:2}, 14 {totalPrice:null,voucherSeq:3} 15]; 16 17A.forEach((a) => { 18 const total = a.num * a.price; 19 const target = B.find((b) => b.voucherSeq === a.voucherSeq); 20 target.totalPrice += total; 21}) 22 23console.log(B);

結果

[ { totalPrice: 1010, voucherSeq: 1 }, { totalPrice: 1400, voucherSeq: 2 }, { totalPrice: 5700, voucherSeq: 3 } ]

投稿2021/06/09 08:32

nekoniki

総合スコア2411

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

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

hololiveyukimin

2021/06/09 08:43

不慣れなため、書き方に乱れがあったこと申し訳ありません。 ご指摘のコードで解決致しました。 ありがとうございます。
guest

0

javascript

1var B=[...new Set(A.map(x=>x.voucherSeq))].map(x=>({totalPrice:A.filter(y=>y.voucherSeq==x).reduce((x,y)=>x+y.num*y.price,0),voucherSeq:x}));

投稿2021/06/09 08:36

yambejp

総合スコア116724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問