2015-02-12 14 views
8

Ad esempio, da questi due oggetti:Angularjs unire due oggetti ignorando i valori nulli e mancanti

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

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

voglio questo (oggetto 2 sostituzioni oggetto 1 eccetto per proprietà nulle o proprietà che non ha):

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

angular.extend (object1, oggetto2) funziona, ma ha la precedenza di proprietà di età su null

+0

che è necessario rimuovere manualmente –

risposta

10

è possibile rimuovere le proprietà null in oggetto 2 prima di chiamare la estendono.

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

Potrebbe funzionare in modo ricorsivo? – TrtG

+0

Ho modificato la funzione removeNull per funzionare in modo ricorsivo, è possibile controllarlo. –

2

È possibile utilizzare questa funzione personalizzata estendere il meccanismo, invece di angular.extend nativo.

/** 
* 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;