You can use $watch expression.
Here is another way:-(download underscore.js or CDN)
http://plnkr.co/edit/hrOrEdaQ0M7wEgWlRHlO?p=preview
- angular.js copy (angular.copy()) method.
underscore.js extend method.
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
var vm = this;
vm.sourceArray = [{id: '0', name: 'someObject'}, {id: '1', name: 'anotherObject'}];
vm.targetArray = angular.copy(vm.sourceArray);
// angular.copy(vm.sourceArray, vm.targetArray);
vm.push = function(){
let found = false;
angular.forEach(vm.sourceArray, function(el){
if (el.id === vm.id){
el.name = vm.name;
found = true;
}
});
if (!found){
vm.sourceArray.push({id: vm.id, name: vm.name});
_.extend(vm.targetArray, vm.sourceArray);
}
};
vm.pushTarget = function(){
let found = false;
angular.forEach(vm.targetArray, function(el){
if (el.id === vm.id1){
el.name = vm.name1;
found = true;
}
});
if (!found){
console.log({id: vm.id, name: vm.name})
vm.targetArray.push({id: vm.id1, name: vm.name1});
}
};
});
you can get underscore.js code:-
_.extend = createAssigner(_.allKeys);
// An internal function for creating assigner functions.
var createAssigner = function(keysFunc, undefinedOnly) {
return function(obj) {
var length = arguments.length;
if (length < 2 || obj == null) return obj;
for (var index = 1; index < length; index++) {
var source = arguments[index],
keys = keysFunc(source),
l = keys.length;
for (var i = 0; i < l; i++) {
var key = keys[i];
if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
}
}
return obj;
};
};
// Retrieve all the property names of an object.
_.allKeys = function(obj) {
if (!_.isObject(obj)) return [];
var keys = [];
for (var key in obj) keys.push(key);
// Ahem, IE < 9.
if (hasEnumBug) collectNonEnumProps(obj, keys);
return keys;
};
// Extend a given object with all the properties in passed-in object(s).