web-dev-qa-db-ja.com

オブジェクトをマージする方法は?

たとえば、次の2つのオブジェクトから:

var object1 = {
  "color": "yellow",
  "size": null,
  "age": 7,
  "weight": null
}

var object2 = {
  "color": "blue",
  "size": 51,
  "age": null
}

これ欲しい (object2オーバーライドobject1nullプロパティまたは彼が持たないプロパティを除く):

{
  "color": "blue",
  "size": 51,
  "age": 7,
  "weight": null
}
34
TrtG

コピー

var src = { name: 'Apple', price: 5};
var dst= angular.copy(src);
  • ディープコピー

拡張

var mergedObject = angular.extend(dst, src1, src2, ...) 
  • 浅いコピー

マージ

var mergedObject = angular.merge(dst, src);
  • since angular 1.4+
  • ディープ(再帰的)コピー

Nullで上書きしない場合は、 this を使用できます。


Object.assign()

let movie2 = Object.assign({}, movie1, { episode: 8 });
  • fot Angular 2+(ECMAScript 6)

ソース:

61
Beri

angularの新しいバージョン(少なくとも1.4.0)の場合、 angular.merge

Extend()とは異なり、merge()はソースオブジェクトのオブジェクトプロパティに再帰的に下降し、ディープコピーを実行します。

18

Angualr.extendを使用しても、要求された結果は生成されません。 object2.age null値は、object1.age値をオーバーライドします。

angular.extend(object1、object2)は、次の結果を生成します。

{
    "color" : "blue", 
    "size" : 51, 
    "age" : null,   <=== undesirable result
    "weight" : null
}

次のコードを使用して、nullプロパティをスキップします

for (var prop in object1) {
    if(object1.hasOwnProperty(prop) && object2.hasOwnProperty(prop) && object2[prop]!=null) {
        object1[prop] = object2[prop];
    }
}

これにより、次の要求結果が生成されます

{
    "color" : "blue", 
    "size" : 51, 
    "age" : 7, 
    "weight" : null
}
3
Saeed D.