Node.js开发指南 如何在Node.js中合并两个复杂对象
沉沙 2018-07-26 来源 : 阅读 1205 评论 0

摘要:本篇Node.js教程探讨了如何在Node.js中合并两个复杂对象,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入。

本篇Node.js教程探讨了如何在Node.js中合并两个复杂对象,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入。


 通常情况下,在Node.js中我们可以通过underscore的extend或者lodash的merge来合并两个对象,但是对于像下面这种复杂的对象,要如何来应对呢?

  例如我有以下两个object:

 

var obj1 = {

    "name" : "myname",

    "status" : 0,

    "profile": { "sex":"m", "isactive" : true},

    "strarr":["one", "three"],

    "objarray": [

    {

        "id": 1,

        "email": "a1@me.com",

        "isactive":true

    },

    {

        "id": 2,

        "email": "a2@me.com",

        "isactive":false

    }

    ]

};

var obj2 = {

    "name" : "myname",

    "status" : 1,

    "newfield": 1,

    "profile": { "isactive" : false,  "city": "new York"},

    "strarr":["two"],

    "objarray": [

    {

        "id": 1,

        "isactive":false

    },

    {

        "id": 2,

        "email": "a2modified@me.com"

    },

    {

        "id": 3,

        "email": "a3new@me.com",

        "isactive" : true

    }

    ]

};

 

  希望合并之后的结果输出成下面这样:

 

{ name: 'myname',

  status: 1,

  profile: { sex: 'm', isactive: false, city: 'new York' },

  strarr: [ 'one', 'three', 'two' ],

  objarray:

  [ { id: 1, email: 'a1@me.com', isactive: false },

   { id: 2, email: 'a2modified@me.com', isactive: false },

   { id: 3, email: 'a3new@me.com', isactive: true } ],

newfield: 1 }

 

   通过underscore或者lodash现有的方法我们无法实现上述结果,那只能自己写代码来实现了。

 

function mergeObjs(def, obj) {

  if (!obj) {

    return def;

  } else if (!def) {

    return obj;

  }

 

  for (var i in obj) {

    // if its an object

    if (obj[i] != null && obj[i].constructor == Object)

    {

      def[i] = mergeObjs(def[i], obj[i]);

    }

    // if its an array, simple values need to be joined.  Object values need to be remerged.

    else if(obj[i] != null && (obj[i] instanceof Array) && obj[i].length > 0)

    {

      // test to see if the first element is an object or not so we know the type of array we're dealing with.

      if(obj[i][0].constructor == Object)

      {

        var newobjs = [];

        // create an index of all the existing object IDs for quick access.  There is no way to know how many items will be in the arrays.

        var objids = {}

        for(var x= 0, l= def[i].length ; x < l; x++ )

        {

          objids[def[i][x].id] = x;

        }

 

        // now walk through the objects in the new array

        // if the ID exists, then merge the objects.

        // if the ID does not exist, push to the end of the def array

        for(var x= 0, l= obj[i].length; x < l; x++)

        {

          var newobj = obj[i][x];

          if(objids[newobj.id] !== undefined)

          {

            def[i][x] = mergeObjs(def[i][x],newobj);

          }

          else {

            newobjs.push(newobj);

          }

        }

 

        for(var x= 0, l = newobjs.length; x<l; x++) {

          def[i].push(newobjs[x]);

        }

      }

      else {

        for(var x=0; x < obj[i].length; x++)

        {

          var idxObj = obj[i][x];

          if(def[i].indexOf(idxObj) === -1) {

             def[i].push(idxObj);

          }

        }

      }

    }

    else

    {

      def[i] = obj[i];

    }

  }

  return def;}

 

   将上述代码稍作改进,我们可以实现在合并过程中将Number类型的值自动相加。

 

function merge(def, obj) {

    if (!obj) {

        return def;

    }

    else if (!def) {

        return obj;

    }

 

    for (var i in obj) {

        // if its an object

        if (obj[i] != null && obj[i].constructor == Object)

        {

            def[i] = merge(def[i], obj[i]);

        }

        // if its an array, simple values need to be joined.  Object values need to be re-merged.

        else if(obj[i] != null && (obj[i] instanceof Array) && obj[i].length > 0)

        {

            // test to see if the first element is an object or not so we know the type of array we're dealing with.

            if(obj[i][0].constructor == Object)

            {

                var newobjs = [];

                // create an index of all the existing object IDs for quick access.  There is no way to know how many items will be in the arrays.

                var objids = {}

                for(var x= 0, l= def[i].length ; x < l; x++ )

                {

                    objids[def[i][x].id] = x;

                }

 

                // now walk through the objects in the new array

                // if the ID exists, then merge the objects.

                // if the ID does not exist, push to the end of the def array

                for(var x= 0, l= obj[i].length; x < l; x++)

                {

                    var newobj = obj[i][x];

                    if(objids[newobj.id] !== undefined)

                    {

                        def[i][x] = merge(def[i][x],newobj);

                    }

                    else {

                        newobjs.push(newobj);

                    }

                }

 

                for(var x= 0, l = newobjs.length; x<l; x++) {

                    def[i].push(newobjs[x]);

                }

            }

            else {

                for(var x=0; x < obj[i].length; x++)

                {

                    var idxObj = obj[i][x];

                    if(def[i].indexOf(idxObj) === -1) {

                        def[i].push(idxObj);

                    }

                }

            }

        }

        else

        {

            if (isNaN(obj[i]) || i.indexOf('_key') > -1){

                def[i] = obj[i];

            }

            else{

                def[i] += obj[i];

            }

        }

    }

    return def;

}

 

  例如有以下两个对象:

 

var data1 = {

    "_id" : "577327c544bd90be508b46cc",

    "channelId_info" : [

    {

        "channelId_key" : "0",

        "secondLevel_group" : [

        {

            "secondLevel_key" : "568cc36c44bd90625a045c60",

            "sender_group" : [

            {

                "sender_key" : "577327c544bd90be508b46cd",

                "sender_sum" : 40.0

            }

            ],

            "senders_sum" : 40.0

        }

        ],

        "channelId_sum" : 40.0

    }

    ],

    "car_sum" : 40.0

};

var data2 = {

    "_id" : "577327c544bd90be508b46cc",

    "channelId_info" : [

    {

        "channelId_key" : "0",

        "secondLevel_group" : [

        {

            "secondLevel_key" : "568cc36c44bd90625a045c60",

            "sender_group" : [

            {

                "sender_key" : "577327c544bd90be508b46cd",

                "sender_sum" : 20.0

            },

            {

                "sender_key" : "5710bcc7e66620fd4bc0914f",

                "sender_sum" : 5.0

            }

            ],

            "senders_sum" : 25.0

        },

        {

            "secondLevel_key" : "55fbeb4744bd9090708b4567",

            "sender_group" : [

            {

                "sender_key" : "5670f993a2f5dbf12e73b763",

                "sender_sum" : 10.0

            }

            ],

            "senders_sum" : 10.0

        }

        ],

        "channelId_sum" : 35.0

    },

    {

        "channelId_key" : "1",

        "secondLevel_group" : [

        {

            "secondLevel_key" : "568cc36c44bd90625a045c60",

            "sender_group" : [

            {

                "sender_key" : "577327c544bd90be508b46cd",

                "sender_sum" : 20.0

            }

            ],

            "senders_sum" : 20.0

        }

        ],

        "channelId_sum" : 20.0

    }

    ],

    "car_sum" : 55.0

};

 

  合并之后的结果如下:

 

{

    "_id": "577327c544bd90be508b46cc",

    "channelId_info": [

        {

            "channelId_key": "0",

            "secondLevel_group": [

                {

                    "secondLevel_key": "568cc36c44bd90625a045c60",

                    "sender_group": [

                        {

                            "sender_key": "577327c544bd90be508b46cd",

                            "sender_sum": 60

                        },

                        {

                            "sender_key": "5710bcc7e66620fd4bc0914f",

                            "sender_sum": 5

                        }

                    ],

                    "senders_sum": 65

                },

                {

                    "secondLevel_key": "55fbeb4744bd9090708b4567",

                    "sender_group": [

                        {

                            "sender_key": "5670f993a2f5dbf12e73b763",

                            "sender_sum": 10

                        }

                    ],

                    "senders_sum": 10

                }

            ],

            "channelId_sum": 75

        },

        {

            "channelId_key": "1",

            "secondLevel_group": [

                {

                    "secondLevel_key": "568cc36c44bd90625a045c60",

                    "sender_group": [

                        {

                            "sender_key": "577327c544bd90be508b46cd",

                            "sender_sum": 20

                        }

                    ],

                    "senders_sum": 20

                }

            ],

            "channelId_sum": 20

        }

    ],

    "car_sum": 95

}

 

本文由职坐标整理发布,欢迎关注职坐标Node.js频道,学习更多WEB前端知识!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程