【问题标题】:Angularjs merge two objects ignoring null and missing valuesAngularjs合并两个对象忽略空值和缺失值
【发布时间】:2015-04-12 23:27:22
【问题描述】:

例如,从这两个对象:

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

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

我想要这个(对象 2 覆盖对象 1,除了 null 属性或他没有的属性):

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

angular.extend(object1, object2) 有效,但将 age 属性覆盖为 null

【问题讨论】:

  • 你必须手动删除

标签: javascript angularjs


【解决方案1】:

您可以在调用扩展之前删除对象 2 中的空属性。

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>

【讨论】:

  • 我将removeNull函数修改为递归工作,你可以检查一下。
【解决方案2】:

您可以将此函数用作自定义扩展机制而不是原生 angular.extend。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-11
    • 2017-08-05
    • 1970-01-01
    • 2020-11-25
    • 2017-01-27
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多