[解決済み] 2つのJavaScriptオブジェクトのプロパティを動的にマージするにはどうすればよいですか?
2022-03-15 09:15:16
質問
私は、実行時に2つの(非常に単純な)JavaScriptオブジェクトをマージすることができるようにする必要があります。 たとえば、私はしたい。
var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }
obj1.merge(obj2);
//obj1 now has three properties: food, car, and animal
これを行うための組み込みの方法はあるのでしょうか? 再帰は必要なく、関数をマージする必要もなく、フラットオブジェクトのメソッドだけです。
どのように解決するのですか?
ECMAScript 2018標準メソッド
を使用することになります。 オブジェクトの広がり :
let merged = {...obj1, ...obj2};
merged
は、現在では
obj1
と
obj2
. のプロパティは
obj2
にあるものは上書きされます。
obj1
.
/** There's no limit to the number of objects you can merge.
* Later properties overwrite earlier properties with the same name. */
const allRules = {...obj1, ...obj2, ...obj3};
また、ここでは MDNドキュメント この構文では babel を使っている場合は babel-plugin-transform-object-rest-spread プラグインを使用することで、動作させることができます。
ECMAScript 2015 (ES6)標準メソッド
/* For the case in question, you would do: */
Object.assign(obj1, obj2);
/** There's no limit to the number of objects you can merge.
* All objects get merged into the first object.
* Only the object in the first argument is mutated and returned.
* Later properties overwrite earlier properties with the same name. */
const allRules = Object.assign({}, obj1, obj2, obj3, etc);
(参照 MDN JavaScript リファレンス )
ES5以前のメソッド
for (var attrname in obj2) { obj1[attrname] = obj2[attrname]; }
のすべての属性を追加するだけであることに注意してください。
obj2
を
obj1
を使いたいのであれば、これは望ましいことではありません。
obj1
.
フレームワークを使用していて、プロトタイプに問題がある場合は、次のようなチェックを行う必要があります。
hasOwnProperty
しかし、このコードで99%のケースはうまくいきます。
関数例です。
/**
* Overwrites obj1's values with obj2's and adds obj2's if non existent in obj1
* @param obj1
* @param obj2
* @returns obj3 a new object based on obj1 and obj2
*/
function merge_options(obj1,obj2){
var obj3 = {};
for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; }
for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; }
return obj3;
}
関連
-
vue ディレクティブ v-html と v-text
-
[解決済み】"フォームが接続されていないため、フォームの送信がキャンセルされました "というエラーの取得について
-
[解決済み】TypeScript-のAngular Frameworkエラー - "exportAsがngFormに設定されたディレクティブはありません"
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] JavaScriptのオブジェクトが空であることをテストするにはどうすればよいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
fetch ネットワークリクエストラッパーの説明例
-
要素ツリー制御によるvueTreeテーブル
-
vueディレクティブv-bindの使用と注意点
-
vueが定義するプライベートフィルタと基本的な使い方
-
[解決済み】Node Version Manager のインストール - nvm コマンドが見つかりません。
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み】ERROR エラーです。スイッチのname属性が指定されていないフォームコントロールの値アクセッサがない
-
[解決済み】ReactJSでエラー発生 Uncaught TypeError: Super expression は null か関数でなければならず、undefined ではありません。
-
[解決済み】オブジェクトのプロパティを別のオブジェクトに複製する方法は?複製
-
[解決済み] オブジェクトのマージ(連想配列)【重複