🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

1回答

876閲覧

React reduceの動作について

2_34_koki

総合スコア67

JavaScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2020/11/22 14:27

現在Reactのアプリ作成の中でreduceの動作について質問させてください.

下記にて全くわからない動作する場所があるので解説して欲しいです.

① test_funcを呼ぶ
② middleObjectを定義して, reduceが走る
③ splitして文字を切り出す
④ !acc[Name1]がtrueとなり中が実行
⑤ if-elseでelseが実行される.
0:[{id: "A/testA/AA/sample1.jpg", name: "A/testA/AA/sample1.jpg"}]がコンソールに出力
⑦ middleObject[Name2]に代入される
AA: children: Array(2) 0: {id: "A/testA/AA/sample1.jpg", name: "A/testA/AA/sample1.jpg"} 1: {id: "A/testA/AA/sample2.jpg", name: "A/testA/AA/sample2.jpg"} length: 2 __proto__: Array(0) id: "testA-AA" name: "AA"がコンソールに出力される. (ここがわからない.)
0とコンソールに出力される.

この⑧の場所がわからないのがまだインデックス0番しか処理指定なのになぜかインデックス1の値の処理がされている点です.
正直かなり時間悩んでいるので知恵を貸してもらいたいです.
どうかどうかよろしくお願いします.

javascript

1import React from "react"; 2import logo from "./logo.svg"; 3import "./App.css"; 4 5const test_func = (fileName: string[]) => { 6 var middleObject: { [key: string]: any } = {}; 7 const tmp = fileName.reduce<{ [key: string]: any }>((accP, current, idx) => { 8 var acc = accP; 9 const split = current.split("/"); 10 const Name1 = split[1]; 11 const Name2 = split[2]; 12 const newChild = { 13 id: current, 14 name: current, 15 }; 16 17 if (!acc[Name1]) { 18 middleObject = {}; 19 } 20 21 if (middleObject[Name2]) { 22 middleObject[Name2]["children"].push(newChild); 23 } else { 24 console.log([newChild]); 25 middleObject[Name2] = { 26 id: Name1 + "-" + Name2, 27 name: Name2, 28 children: [newChild], 29 }; 30 console.log(middleObject); 31 console.log(idx); 32 } 33 34 if (!acc[Name1]) { 35 acc[Name1] = { 36 id: Name1, 37 name: Name1, 38 children: Object.values(middleObject), 39 }; 40 } 41 42 return acc; 43 }, {}); 44 45 return tmp; 46}; 47 48function App() { 49 const fileName1 = ["A/testA/AA/sample1.jpg", "A/testA/AA/sample2.jpg"]; 50 const renderTreeObject = test_func(fileName1); 51 return <div className="App"></div>; 52} 53 54export default App; 55

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

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

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

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

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

guest

回答1

0

React関係なく動かす事はできました。

https://jsbin.com/tetoteqife/edit?html,js,console

かなり読みづらいコードの書き方がされているように思います。

まだインデックス0番しか処理指定なのになぜかインデックス1の値の処理がされている点です.

idx = 1 のときはconsole.logの方の分岐に入っていないだけで、idx=1のときの処理は行われていないように見えました。
いろんなところに、console.logを入れて確認するとよいでしょう。

また、余計なお世話だとは思うのですが読みにくいのはこういう所も関係していると思います。

[JavaScript] reduceは可読性が悪くループで置き換え可能なので使うべきではない - Qiita
https://qiita.com/standard-software/items/3254c19ed5229f3aba9a

投稿2020/11/23 03:48

編集2020/11/23 04:20
standard-soft

総合スコア197

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問