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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

1245閲覧

Map & ReduceのReduceがReduceと呼ばれる理由とは?

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/03/18 04:31

以下はJavaScriptのコードになりますが、他言語でもMap, Reduceはあるようなので、他の言語のタグもつけさせて頂いております。

JavaScript

1const items = [ 2 {id:1, name: 'buy milk', isDone: true}, 3 {id:2, name: 'buy milf', isDone: false}, 4 {id:3, name: 'buy silk', isDone: true}, 5] 6 7const res = items.reduce((acc, item) => { 8 9 //itemをここで加工したと仮定 10 11 acc.push(item) 12 return acc 13}, []) 14

reduceは使い方によってはmapみたいな使い方も出来るとおもいます。つまり、渡って来た数のアイテムを何らかの加工をした後に同じ数だけ返すみたいな感じで。なので、reduceというと減るみたいなイメージがあるのですが、使い方によっては特に渡って来た数より少ない結果を返すということにもならないです。

reduceはなぜreduceと呼ばれるのでしょうか?これは渡って来たデータの数よりも、何らかの処理を行った後、フィルターをかけて少ない数のデータを返すことが前提の使い方が想定されてるのでしょうか?

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

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

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

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

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

guest

回答3

0

acc1つに減ってますね。処理のなかでpushしているので、内部は0から3に増えてますが。
処理中で内部の要素を増やしたら増えて当然です。2回pushすれば2倍になるし。

数学的に言うと、ベクトルがスカラーになると言うことです。
要素の個数がどうこうという話では無いです。

参考:
reduce() はアキュムレータと配列の各要素に対して(左から右へ)関数を適用し、単一の値にします。

投稿2018/03/18 05:00

otn

総合スコア84423

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

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

退会済みユーザー

退会済みユーザー

2018/03/18 06:19

最初の文が最高にわかりやすいです。 [a, b, c, d, ...(複数)] => acc(1個) ということですね。
guest

0

ベストアンサー

reduceの日本語訳が「減らします」なので、
意図通り1個のものに集約する用途として使ってください。

reduceは使い方によってはmapみたいな使い方も出来るとおもいます。

可能か不可能かで言えば可能ですね。

実際やってる事自体は単なるループな訳で、
acc.pushを2回以上叩けば配列の要素数は減るどころか増えますね。
if文でacc.pushをスキップすればfilterの代わりになるでしょう。

使い方によっては特に渡って来た数より少ない結果を返すということにもならないです。

それを言い出せばリスト操作系のメソッドはほぼ全て不要です。
filterもmapもforEachも必要ありません。

しかしコードは文章です。
マシンだけではなく、人間も読者の対象であり、メンテされるべき文章です。

もし読んだ小説内で「減らします」というタイトルで、
逆にどんどん増殖してたら読者はどう思いますか?
この作者、おかしなものでも食ってしまったのだろうか……と不安に思うのではありませんか?

まぁ、小説は読者を楽しませるものなので、そういうケースは無いとは言い切れません。
全て読み終わった後で、「あ、そのページでは気付かなかったけど、確かに登場人物減ってる……!?」というトリックに使われるケースもありますからね。

でも、ソースコードは報告文に近い文章なので、そういうトリックを使ってはいけません。
普通に書いて動かしたコードですら1ヶ月挟んだら読みづらくて敵わないのに、
そんな暗号書く奴が一緒のプロジェクトで仕事したくはありません。

フィルターをかけて少ない数のデータを返すことが前提の使い方が想定されてるのでしょうか?

要素数を減らす場合はfilterを使って下さい。

JavaScript

1const items = [ 2 {id:1, name: 'buy milk', isDone: true}, 3 {id:2, name: 'buy milf', isDone: false}, 4 {id:3, name: 'buy silk', isDone: true}, 5] 6const res = items 7 .filter(it => it.isDone) 8 .map(it => ({...it, hoge: 123}));

reduceはなぜreduceと呼ばれるのでしょうか?

配列を使って、一つの変数を転がしながら加工していくからです。
基本的には配列→プリミティブ型(NumberやString)、配列→オブジェクトに加工する目的で使うようにしてください。

配列→配列は基本的には使わないでください。
利用用途が多いので既に強力なメソッドが沢山用意されているため、干渉することが多いからです。

まぁ、reduceの動作は単なるループ構文と同じ事が出来るので最後の手段として使われるケースは多いのと、JavaScriptのリスト操作系のメソッドは大概貧弱なのでreduceの登場回数は多いですが、
出来るだけ使わないということを覚えておいて下さい。
LodashやRamda.js等の関数型プログラミング用のライブラリを利用することで、この安易なreduceを減らす事が出来ます。

最後にreduceの推奨される使い方をしながら、値の集計するコードを書いてみました。

JavaScript

1const users = [ 2 {name: "taro", score: 100}, 3 {name: "jiro", score: 80}, 4 {name: "saburo", score: 90}, 5 {name: "noise"}, // スコアが無いノイズデータ 6]; 7 8// reduceを使った合計得点の算出 9const scores = users 10 .filter(it => it.score) 11 .map(it => it.score); 12const add = (a, b) => a + b; 13const max = (a, b) => Math.max(a, b); 14console.log("max:", scores.reduce(max, 0)); // max: 100 15console.log("sum:", scores.reduce(add, 0)); // sum: 270 16console.log("avg:", scores.reduce(add, 0) / scores.length); // avg: 90

投稿2018/03/18 05:48

miyabi-sun

総合スコア21158

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

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

0

特殊な例で数が減らなかったと言って、名前をつけてはいけない理由になりません。

mapでできるのであればmapで書いた方がコードが読みやすいです。
数が減らないことを明示しています。
reduceでmapができることが全てできるのであれば、reduceの方がより一般的な関数であるということです。

書きやすさ、効率まで全部同じであるかはわかりませんが。


https://codeiq.jp/magazine/2016/02/31747/

reduceとはリスト等の引数を一つの値に集約させることを意味する、抽象的な概念で、関数型言語にはこれを実現するための様々な高階関数が存在します。

投稿2018/03/18 04:53

編集2018/03/18 04:56
mkgrei

総合スコア8560

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問