2015-02-12 8 views
30

Например, из этих двух объектов:Angularjs объединить два объекта

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

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

Я хочу, чтобы это (object2 переопределяет object1 для null свойств или свойств у него нет, кроме):

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

ответ

53

Copy

var src = { name: 'Apple', price: 5}; 
var dst= angular.copy(src); 
  • глубокая копия

Extend:

var mergedObject = angular.extend(dst, src1, src2, ...) 
  • неполную копию

Merge:

var mergedObject = angular.merge(dst, src); 
  • поскольку угловой 1.4+
  • глубоко (рекурсивно) скопировать

Если вы хотите, чтобы не перезаписать с нулем, вы можете использовать this.


Object.assign():

let movie2 = Object.assign({}, movie1, { episode: 8 }); 
  • фот Угловое 2+ (ECMAScript 6)

Источники:

+0

Использование angualr.extend не даст запрашиваемого результата. Значение object2.age null переопределит значение object1.age. –

+0

@ SaeedD.true, но уже есть способ исправить это. Проверьте мою ссылку в разделе обновления. – Beri

+0

Стоит отметить: угловое расширение и слияние отличаются. Один неглубокий другой глубокий. – DanteTheSmith

3

Использование angualr.extend не даст результата запрошенной. Значение object2.age null переопределит значение object1.age.

угловой.продлить (object1, object2) произведет следующий результат:

{ 
    "color" : "blue", 
    "size" : 51, 
    "age" : null, <=== undesirable result 
    "weight" : 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 
} 
+1

Я нашел дискуссию, анализируя разницу между 'extend' и' merge'. В этом случае мы можем использовать ваш код или вызвать 'angular.merge', если у нас есть угловой 1.4.x. – stanleyxu2005

18

Для более поздние версии (не менее 1.4.0) углового вы можете использовать angular.merge

В отличие от extend(), merge() рекурсивно спускается в свойства объекта исходных объектов, выполняя глубокую копию.

Смежные вопросы