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

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

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

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

Q&A

解決済

1回答

1639閲覧

lodashの関数通したオブジェクトをReact、typescript環境で使うには?

退会済みユーザー

退会済みユーザー

総合スコア0

Lodash

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

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

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

0グッド

0クリップ

投稿2022/06/19 15:48

lodashの関数通したオブジェクトをReact、typescript環境で使うには?

Reactの入門者です。
オブジェクト配列である変数productListを、lodashの.groupBy()を使用しキー"category"毎にグルーピングした配列を
テンプレートに表示させたいのですが、下記のコードではObject.entries().map()のところでエラーが発生します。

lodash関数が返す変数は標準の配列ではなくlodash特有のオブジェクトになるんでしょうか。
それが型付の世界でどういう取り扱いになるのかが理解できていません。

また、下記の疑問点はReact,JSXの知識になると思うのですが、

・やりたいこととしては、categoryでグルーピングしたリストをテンプレートに表示したいため
2重ループを書く必要が出てきますが、JSX(tsx)内ではどのように記述したら良いのでしょうか?

・ちなみに、ドキュメントを見るとlodashの関数にもmap()関数が存在するようですがJSX内で標準のmap()ではない、lodashのmap()も使えるのでしょうか?

lodash,react(jsx),typescriptと、登場人物が多く要因が複雑に絡み合ってそうで、
解決方法のご教示をお願いしたいです。よろしくお願いします。

javascript

1 type product = { 2 category: string 3 price: string 4 stocked: boolean 5 name: string 6 } 7 8 const productList: product[] = [ 9 { category: "Sporting Goods", price: "$49.99", stocked: true, name: "Football" }, 10 { category: "Sporting Goods", price: "$9.99", stocked: true, name: "Baseball" }, 11 { category: "Sporting Goods", price: "$29.99", stocked: false, name: "Basketball" }, 12 { category: "Electronics", price: "$99.99", stocked: true, name: "iPod Touch" }, 13 { category: "Electronics", price: "$399.99", stocked: false, name: "iPhone 5" }, 14 { category: "Electronics", price: "$199.99", stocked: true, name: "Nexus 7" } 15 ]; 16 17 const dict: any = _(productList).groupBy('category').value() 18 19 return ( 20 <table> 21 <tbody> 22 <tr> 23 { 24 Object.entries(dict).map(key: string) => { 25 return ( 26 <tr> 27 <td>{key}</td> 28 </tr> 29 ) 30 }) 31 } 32 </tr> 33 </tbody> 34 </table> 35 )

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

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

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

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

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

guest

回答1

0

ベストアンサー

@types/lodash を入れてれば dict の型は _.Dictionary<product[]> になります。(any で型を潰しちゃうのはもったいない。) で、Dictionary の型は

ts

1 interface Dictionary<T> { 2 [index: string]: T; 3 }

なので、Object.entries(dict) の型は [string, product[]][] ですね。(Array<[string, Array<product>]> と書いた方が分かりやすいかも?) これを map すると、例えばこんな感じでしょうか。

tsx

1 const dict = _(productList).groupBy('category').value(); 2 3 return ( 4 <table> 5 <tbody> 6 { 7 Object.entries(dict).map(([category, products]) => ( 8 products.map((product, index) => ( 9 <tr> 10 {index === 0 && <td rowSpan={products.length}>{category}</td>} 11 <td>{product.name}</td> 12 <td>{product.price}</td> 13 <td>{product.stocked ? 'true' : 'false'}</td> 14 </tr> 15 )) 16 )) 17 } 18 </tbody> 19 </table> 20 );

まず、map の中の関数の { return ...; } が省略されてる件ですが、アロー関数にはいろんな省略形が用意されてまして、特に関数の中身が return だけの場合は {} と return を省略できます。例えば、(a, b) => { return a + b; } の代わりに (a, b) => a + b と書けます。
参考: JavaScriptのアロー関数の省略記法について - Qiita
参考: JavaScript省略形多すぎ問題 - Qiita

そして、求める結果はこんな感じでしょうか。

tsx

1 return ( 2 <table> 3 <tbody> 4 { 5 Object.entries(dict).map(([category, products]) => ( 6 <> 7 <tr> 8 <th colSpan={2}>{category}</th> 9 </tr> 10 { 11 products.map(product => ( 12 <tr> 13 <td> 14 { 15 product.stocked ? 16 product.name : 17 <span style={{ color: 'red' }}>product.name</span> 18 } 19 </td> 20 <td>{product.price}</td> 21 </tr> 22 )) 23 } 24 </> 25 )) 26 } 27 </tbody> 28 </table> 29 );

投稿2022/06/19 17:09

編集2022/06/20 07:02
hoshi-takanori

総合スコア7899

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

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

退会済みユーザー

退会済みユーザー

2022/06/20 04:34

ありがとうございます!!@types/lodash入れてます。groupByが返すオブジェクトはそのような型なんですね。 vscodeの問題の表示から確認ができるようですね。 追加の質問になってしまうのですが、 下記のようなHTMLで出力したい場合、JSXはどう記述したらいいでしょうか?(公式チュートリアルに準拠してます:https://ja.reactjs.org/docs/thinking-in-react.html) ご回答いただいたmap()の=>の後が丸括弧になってるのがわからず、さらに多重ループになっているのでなおさら理解が追いつかず・・ 2重ループの1つ目のループでHTML出力、ネストされた2つめのループ内でもHTML出力がしたい、という風になるかと思います。 ご教示いただけると幸いです。 ```html <tbody> <tr> <th colspan="2">Sporting Goods</th> </tr> <tr> <td>Football</td> <td>$49.99</td> </tr> <tr> <td>Baseball</td> <td>$9.99</td> </tr> <tr> <td><span style="color: red;">Basketball</span></td> <td>$29.99</td> </tr> <tr> <th colspan="2">Electronics</th> </tr> <tr> <td>iPod Touch</td> <td>$99.99</td> </tr> <tr> <td><span style="color: red;">iPhone 5</span></td> <td>$399.99</td> </tr> <tr> <td>Nexus 7</td> <td>$199.99</td> </tr> </tbody> ```
hoshi-takanori

2022/06/20 07:14

書き忘れましたが、lodash (と、その前身とも言える underscore.js) の map 関数は JavaSript の配列に map メソッドがなかった頃に作られたものと理解しており、現在では普通に配列の map メソッドを使えば良いかと。(lodash の map 関数はオブジェクトに対しても使えるようなので、そちらは今でも利用価値はあるかも。) https://anken-hyouban.com/blog/2021/09/19/lodash/
退会済みユーザー

退会済みユーザー

2022/06/22 13:47

ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問