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

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

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

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

Q&A

解決済

1回答

1147閲覧

JavaScriptオブジェクトの値に対してreduceを適用させたい

toshiyan

総合スコア74

JavaScript

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

1グッド

1クリップ

投稿2020/10/02 14:27

Underscore.jsで、あるオブジェクトの値に対してreduceを適用させたいです。
具体的には以下のようにしたいです。

javascript

1const arr = {a: [1, 2, 3], b: [4, 5], c: [6, 7, 8]} 2 3// ここに何らかのコードを書く 4 5console.log(result) //=> {a: 6, b: 9, c: 21}

現状では、次のように命令型と関数型がまぜこぜになったコードしか書けていないです。

javascript

1const arr = {a: [1, 2, 3], b: [4, 5], c: [6, 7, 8]} 2 3let result = {} 4for (const key of Object.keys(arr)) { 5 const x = arr[key] 6 result[key] = x.reduce((a, b) => a + b, 0) 7} 8 9console.log(result) //=> {a: 6, b: 9, c: 21}

どのようにすれば、もっとシンプルに書けるでしょうか?回答よろしくお願いします。

jun68ykt👍を押しています

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

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

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

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

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

kuma_kuma_

2020/10/02 15:33

個人的な感想になるけど十分いまのままでシンプルで判りやすいコードだと思うよ? 変数名等reduceをこの様な形で行いますという事がコードを見てすぐに判断付きましたから。 仕事でJS書くとどうしても「他の人が見ても判りやすく」という事があり あえてまとめないという選択をする場合があります。 あとJSなら「難読化・圧縮」という方法がありますが、あまり凝った書き方すると変換エラー起こしたりするからな... ほんと個人的にはきれいな書き方だと思うんだけど...
toshiyan

2020/10/03 02:24

ありがとうございます。コードが綺麗と言っていただけて嬉しいです。
guest

回答1

0

ベストアンサー

こんにちは

Underscore.jsで、あるオブジェクトの値に対してreduceを適用させたいです。

ということであれば、Underscore.jsの_.mapObject を使って、以下のようにするとよいかと思います。

javascript

1const result = _.mapObject(arr, values => values.reduce((s, v) => s + v, 0))

追記

Underscore.jsを使わない案を追記します。このような場合、与えられるオブジェクトを

  1. Object.entries で、キーと値の組の配列にして、
  2. map で各プロパティの値に手を加え、
  3. Object.fromEntries でオブジェクトに戻す。

という手順が、よく使う定跡かなと思います。以下は、この手順によるサンプルです。配列要素の合計を算出する関数sumをあらかじめ作っておき、map に与える関数が読みやすくなるようにしています。

javascript

1const sum = values => values.reduce((s, v) => s + v, 0) 2 3const totals = Object.entries(arr).map(([k, values]) => [k, sum(values)]) 4const result = Object.fromEntries(totals);

投稿2020/10/02 15:29

編集2020/10/02 16:17
jun68ykt

総合スコア9058

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

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

toshiyan

2020/10/03 02:15

回答ありがとうございます! mapObjectがまさに僕の欲しかった関数です。ありがとうございます!プレーンなJavaScriptでの記述も参考になりました!
jun68ykt

2020/10/03 12:49

どういたしまして。 > mapObjectがまさに僕の欲しかった関数です。 とのことでよかったです????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問