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

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

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

Lodashは、JavaScriptのユーティリティライブラリ。Underscoreの派生ライブラリで、配列・オブジェクトの操作に便利です。また、コードの可読性も高めることができます。

JavaScript

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

Q&A

解決済

2回答

2694閲覧

リスト内の同じkey同士のvalueの合計

fofine

総合スコア2

Lodash

Lodashは、JavaScriptのユーティリティライブラリ。Underscoreの派生ライブラリで、配列・オブジェクトの操作に便利です。また、コードの可読性も高めることができます。

JavaScript

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

0グッド

0クリップ

投稿2021/07/09 14:13

前提・実現したいこと

javascriptで以下のことを実行したいです。
const array = [
{ foo: 1 },
{ bar: 2 },
{ foo: -2, },
{ foo: 3, bar: 4 },
];

{foo:2,bar:6}
同じkeyのvalueの合計を出力したいです

発生している問題・エラーメッセージ

[ 1, undefined, -2, 3 ] [ undefined, 2, undefined, 4 ]

該当のソースコード

javascript

1import _ from 'lodash' 2const array = [ 3 { foo: 1 }, 4 { bar: 2 }, 5 { foo: -2, }, 6 { foo: 3, bar: 4 }, 7]; 8 9const foo = array.map(obj => obj.foo) 10const bar = array.map(obj => obj.bar); 11_.without(bar,undefined) 12_.without(foo,undefined) 13console.log(foo) 14console.log(bar) 15 16

試したこと

またlodashを導入して
compactやrejerectなどを使用しましたがundefinedが出力されてしまいます。

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

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

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

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

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

guest

回答2

0

ベストアンサー

配列の値を順に処理したい時はreduceを使うとよいと思います。
動作デモ

javascript

1const array = [ 2 { foo: 1 }, 3 { bar: 2 }, 4 { foo: -2 }, 5 { foo: 3, bar: 4 } 6] 7 8// reduce内のコールバック関数の第1引数は現在の値、つまり一巡目はreduceの第二引数である初期値の0 9// それにコールバック関数の第2引数である現在処理している値からfooを取り出して足していく 10// ただしarray内のオブジェクトにはfooがundefinedの場合があるので{ foo = 0 }として無かった場合のデフォルト値を設定している 11const foo = array.reduce((acc, { foo = 0 }) => acc + foo, 0) 12const bar = array.reduce((acc, { bar = 0 }) => acc + bar, 0) 13 14console.log(foo) 15console.log(bar) 16

投稿2021/07/09 14:51

編集2021/07/09 15:02
taku-hu

総合スコア176

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

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

fofine

2021/07/09 15:00

ご回答いただきありがとうございます。 無事解決できました!!
guest

0

mapは変換で1:1な処理を行うには向いていますが、今回はN:1のような集計っぽい処理なのでreduceを使うとよいです。

その前に、手続き的にやるとどう書けるかを考えてみましょう。
arrayに入っているのはobjectで今回はobjectの各キー(foo,bar等)毎に取り出し、合算したい集計したい、という事をやりたいのだと思います

js

1// const array = [{}, ...省略] 2const result = {}; 3for(const entry of array){ 4 for(const [k,v] of Object.entries(entry)){ 5 if(result[k] !== undefined){ 6 result[k] = result[k] + v; 7 }else{ 8 result[k] = v; 9 } 10 } 11}

これをmapやreduceでやるとなると、こんな感じでしょうか(もう少しうまいやり方はあるかとは思います。。)

js

1const result2 = array.flatMap( v => Object.entries(v) ).reduce( (p, [k,v]) => { 2 p[k] = p[k] !== undefined ? p[k] + v : v; 3 return p; 4}, {})

最近のJavaScriptはmap,reduce,flatMapなどの配列を操作するメソッドが揃っているのでlodash無しでもできるかと思います。

投稿2021/07/09 15:02

fukasawah

総合スコア147

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問