[解決済み] ES6でのスプレッドシンタックスによるディープコピー
質問
私は自分のReduxプロジェクトで、配列ではなくオブジェクトで動作するディープコピーマップメソッドを作成しようとしています。私はReduxで各状態が前の状態で何も変更してはいけないと読みました。
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
output[key] = callback.call(this, {...object[key]});
return output;
}, {});
}
動作します。
return mapCopy(state, e => {
if (e.id === action.id) {
e.title = 'new item';
}
return e;
})
しかし、これは内側の項目を深くコピーしないので、私はそれを調整する必要があります。
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
let newObject = {...object[key]};
newObject.style = {...newObject.style};
newObject.data = {...newObject.data};
output[key] = callback.call(this, newObject);
return output;
}, {});
}
これは、どのオブジェクトが渡されるかを知る必要があるため、あまりエレガントではありません。 ES6では、オブジェクトをディープコピーするためにスプレッドシンタックスを使用する方法はあるのでしょうか?
どのように解決するのですか?
ES6にはそのような機能は組み込まれていません。やりたいことに応じて、いくつかの選択肢があると思います。
本当にディープコピーしたいのなら
-
ライブラリを使う。例えば、lodashには
cloneDeep
というメソッドがあります。 - 独自のクローン機能を実装する。
特定の問題に対する代替ソリューション (ディープ コピーなし)
しかし、いくつかの点を変更することをいとわないのであれば、いくつかの作業を省くことができると思います。私は、あなたが関数へのすべての呼び出しサイトを制御していると仮定しています。
-
に渡される全てのコールバックが
mapCopy
に渡される全てのコールバックは、既存のオブジェクトを変異させるのではなく、 新しいオブジェクトを返さなければなりません。例えばmapCopy(state, e => { if (e.id === action.id) { return Object.assign({}, e, { title: 'new item' }); } else { return e; } });
これは
Object.assign
を使用して新しいオブジェクトを作成し、そのオブジェクトのプロパティをe
のプロパティを設定し、その新しいオブジェクトに新しいタイトルを設定します。つまり、既存のオブジェクトを決して変異させず、必要なときだけ新しいオブジェクトを作成するのです。 -
mapCopy
はもう本当にシンプルでいいんです。export const mapCopy = (object, callback) => { return Object.keys(object).reduce(function (output, key) { output[key] = callback.call(this, object[key]); return output; }, {}); }
本来は
mapCopy
はその呼び出し元が正しいことをするのを信頼しています。これが、すべてのコール サイトを制御していることを前提に述べた理由です。
関連
-
[解決済み] let "と "var "の使い分けは?
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み] JavaScriptでページの一番上までスクロールする?
-
[解決済み] Reactでes6クラスを使うときの「super()」と「super(props)」の違いとは?
-
[解決済み] ES6 ジェネレータで redux-saga を使用する利点/欠点と ES2017 async/await で redux-thunk を使用する利点/欠点
-
[解決済み】Node.jsのrequireとES6のimport/exportを使い分ける。
-
[解決済み】ES6 WeakMapの実際の使い道は?
-
[解決済み] JSのDateからDay名
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] CORS: 認証モードは 'include' です。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptでオブジェクトをディープクローンする最も効率的な方法は何ですか?
-
[解決済み】React:setStateを使用してstateのstate.item[1]を更新するには?
-
[解決済み] 文字列のn番目の出現箇所を取得するには?
-
[解決済み] オブジェクトの配列からReactコンポーネントをレンダリングする
-
[解決済み] react-routerのハッシュフラグメントからクエリパラメータを取得する
-
[解決済み] BlobからArrayBufferへ移行する方法
-
[解決済み] TypeScriptプロジェクトで既存のC#クラス定義を再利用する方法
-
[解決済み] イテレータでmap()を使用する
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] なぜjavascriptのES6 Promisesはresolve後も実行を継続するのですか?