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

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

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

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

1回答

668閲覧

Ramdaを使って短くしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

1クリップ

投稿2021/08/19 11:06

編集2021/08/20 10:06

やりたいことはオブジェクトのマージです。
元々は{name: string, hoge: string, fuga: string, piyo: string}のオブジェクトの集合があります。
この集合を、元の集合の要素を上書きする要素は{hoge: string}、追加する要素は{name: string, hoge: string}という一部のプロパディを持ったオブジェクトの集合で上書きします

これをそのまま上書きすると、追加された要素はfugapiyoプロパティを持たないことになります。
ですので、上書きする前に集合から追加する要素を判定して、fugapiyoを追加します
fugahogeを引数に取るasync関数によって求められます

JS

1async main = () => { 2 let originalObj = {a: {name: 'a', hoge: 'hoge', fuga: 'fuga', piyo: 'piyo}} 3 4 let mergeObj = {a: {hoge: 'hogehoge'}, b: {name: 'b', hoge: 'hogehoge'}} 5 6 mergeObj = R.map(obj => { 7 if (!('name' in obj)) return obj 8 9 return {fuga: method(obj.hoge), piyo: 'piyo' ...obj} //methodはasync関数 10 }, mergeObj) 11 12 originalObj = R.mergeDeepRight(originalObj, mergeObj} 13}

このようなコードのmapからassginまでの所を、RamdaかLodashで短く・なるべく分かりやすくまとめたいです
ramdaを使うのは初めてで、何が何だか全然分からない状態でマジで調べようもないです
助けてくださいお願いします

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/08/19 13:47

ramda使うのは初めてで何が何だか全然分からない状態で、調べようもないです 助けてください
退会済みユーザー

退会済みユーザー

2021/08/19 14:58

はい
hoshi-takanori

2021/08/19 20:02

そのコードだけでは動かないし、見ても何がしたいか分からないので答えようがないですね…。
退会済みユーザー

退会済みユーザー

2021/08/20 00:30

何がしたいのかの説明文を追記しました 分かりにくかったらすいません
miyabi-sun

2021/08/20 05:43

そもそも何故Ramda.jsなんか触ってしまったんですか? 書籍: JavaScript関数型プログラミング 複雑性を抑える発想と実践法を学ぶ impress top gearシリーズ 上記の書籍で使われる程度のライブラリであり、 似たような関数型プログラミング体験を行うならば[Lodash](https://lodash.com/)の方がメジャー。 メインで使っている利用者は日本全国探しても私くらいしか居ないんじゃないですか? (私がLiveScript使いで非常に相性良かったから併用しているだけで、LiveScript使いじゃなかったら速攻で投げ捨ててたわ) 書籍や記事も多いLodashを強くオススメします。
退会済みユーザー

退会済みユーザー

2021/08/20 09:49 編集

メジャーなライブラリじゃなかったんですね、知りませんでした Ramdaを選んだのは、便利なオブジェクト操作が出来るライブラリを探したときにどこかで勧められていたからです。
guest

回答1

0

これは回答ではありませんが、追記されたものを読んでも何がしたいのかよく分からず、コメント欄は狭いのでここで確認させてください。

元々は{name: string, hoge: string, fuga: string, piyo: string}のオブジェクトの集合があります。

let originalObj = {a: {name: 'a', hoge: 'hoge', fuga: 'fuga', piyo: 'piyo}}

「集合」とはその型のデータが複数あるという意味なので、例えばこんな感じになるかと思います。

js

1let originalObj = { 2 a: { name: 'a', hoge: 'hoge-1', fuga: 'fuga-1', piyo: 'piyo-1' }, 3 b: { name: 'b', hoge: 'hoge-2', fuga: 'fuga-2', piyo: 'piyo-2' }, 4 c: { name: 'x', hoge: 'hoge-3', fuga: 'fuga-3', piyo: 'piyo-3' }, 5};

ここで疑問ですか、originalObj は配列じゃなくてオブジェクトにしたいということですよね?
また、オブジェクトのキー (a, b, c) と name の値には何か関係がありますか?

この集合を、元の集合の要素を上書きする要素は{hoge: string}、追加する要素は{name: string, hoge: string}という一部のプロパディを持ったオブジェクトの集合で上書きします

let mergeObj = {a: {hoge: 'hogehoge'}, b: {name: 'b', hoge: 'hogehoge'}}

上書きと追加は mergeObj のキー (a, b) が originalObj に存在するかどうかで区別するのでしょうか? それとも、name があるかどうかでしょうか? 具体的には、次の例で

js

1let mergeObj = { 2 a: { hoge: 'hogehoge-1' }, // 上書き 3 b: { name: 'b', hoge: 'hogehoge-2' }, // 上書き? (既存の name と同じ場合) 4 c: { name: 'y', hoge: 'hogehoge-3' }, // 上書き? (既存の name と異なる場合) 5 d: { hoge: 'hogehoge-4' }, // 追加? (name がないのでエラー?) 6 e: { name: 'z', hoge: 'hogehoge-5' }, // 追加 7};
  • a, e はそれぞれ上書きと追加で問題ないと思います。
  • b, c は次のうちどれでしょうか?
    1. 上書き (name が異なる場合は name も上書き?)
    2. 追加 (既存の fuga, piyo は無視して新しい値を設定する)
    3. エラー (または無視)
  • d は次のうちどれでしょうか?
    1. 追加 (name は d または適当な値?)
    2. エラー (または無視)

async main = () => {

これを main という関数名にするのは抵抗があります。関数名は例えば merge として、originalObj, mergeObj を引数に取り、マージしたオブジェクトの集合 (originalObj と同じ型) を返すのが良いのでは。

const merge = async (originalObj, mergeObj) => { ... }

ramdaを使うのは初めてで、

この程度なら、ES6 の map など があれば ramda や lodash は使わなくても充分な気がします。

投稿2021/08/21 02:07

編集2021/08/21 02:49
hoshi-takanori

総合スコア7899

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問