2015-02-12 6 views
8

Zum Beispiel ignoriert, aus diesen beiden Objekten:AngularJS verschmelzen zwei Objekte null und fehlende Werte

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

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

Ich mag dieses (Objekt 2 überschreibt 1 mit Ausnahme null Objekteigenschaften oder Eigenschaften hat er nicht):

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

angular.extend (object1, object2) funktioniert, aber überschreibt Alte Eigenschaft

+0

die Sie manuell entfernen müssen –

Antwort

10

Sie auf null können die Null Eigenschaften in 2 Objekt entfernen vor dem Aufruf der verlängern.

var myApp = angular.module('myApp',[]); 
 

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

 
var inside = { 
 
    "name": "me", 
 
    "age" : 9, 
 
    "nothing": null 
 
} 
 

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

 
function removeNullIn(prop, obj) 
 
{ 
 
    var pr = obj[prop]; 
 
    if(pr === null || pr === undefined) delete obj[prop]; 
 
    else if(typeof pr === 'object') for (var i in pr) removeNullIn(i, pr); 
 
} 
 

 
function removeNull(obj) 
 
{ 
 
    for (var i in obj) { 
 
     removeNullIn(i, obj); 
 
    } 
 
} 
 

 
removeNull(object2); 
 

 
var mergedObject = angular.extend(object1, object2); 
 
console.log(mergedObject);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.9/angular.min.js"></script>

+0

Würde das rekursiv funktionieren? – TrtG

+0

Ich habe die Funktion removeNull modifiziert, um rekursiv zu arbeiten. Sie können es überprüfen. –

2

können Sie diese Funktion als benutzerdefinierte Mechanismus anstelle von nativen angular.extend erweitern verwenden.

/** 
* Extends dst with props from src 
* @see 
* customExtend({a: 1, test : 1}, {b: 1, test : 2}); 
* //this will return {a: 1, b: 1, test: 2} 
* @returns {Object} 
*/ 
var customExtend = function (/* [emptyObject], dst, src */) { 
    var $$args = Array.prototype.slice.call(arguments, 0); 

    if ($$args.length === 3) { 
     $$args.shift(); 
    } 

    for (var i in $$args[1]) { 
     if ($$args[1][i] !== null || angular.isUndefined($$args[1][i])) { 
      $$args[0][i] = $$args[1][i]; 
     } 
    } 

    return $$args[0]; 
}; 


angular.customExtend = customExtend; 
Verwandte Themen