合并两个嵌套对象并在侧面连接数组

时间:2015-12-16 13:44:21

标签: javascript arrays

是否有一个构建方法可以合并我在Object.assign()之间创建的两个嵌套对象 它在我的情况下不起作用,因为我的嵌套对象是array

var obj1 = {
  "name": "Services",
  "category": "Services",
  "subCategory": [{
    "name": "Negative",
    "category": "Negative",
    "subCategory": [{           // only this part differ
      "name": "Expensive",  
      "val": 109,
      "subCategory": null
    }]
  }]
};  


var obj2 = {
  "name": "Services",
  "category": "Services",
  "subCategory": [{
    "name": "Negative",
    "category": "Negative",
    "subCategory": [{            // only this part differ
      "name": "Disorganized",
      "val": 25,
      "subCategory": null
    }]
  }]
};  

它应该像这样合并

var result = {
  "name": "Services",
  "category": "Services",
  "subCategory": [{
    "name": "Negative",
    "category": "Negative",
    "subCategory": [{          //  array concatenation
      "name": "Disorganized",
      "val": 25,
      "subCategory": null
    }, {
      "name": "Expensive",
      "val": 109,
      "subCategory": null
    }]
  }]
};

1 个答案:

答案 0 :(得分:0)

它只是一个提案,如何处理相同的属性和相同的值以及这个特殊的数据结构,'name''subCategory'

{
    "name": "Services",
    "subCategory": [
        {
            "name": "Negative", ...
            "subCategory": [
                {
                    "name": "Expensive", ...
                },
                {
                    "name": "Disorganized", ...
                }
            ]
        }
    ]
}

此解决方案适用于递归,如果名称不匹配,则会添加'subCategory'的元素。



function fuse(target, source) {
    if (target.name === source.name) {
        source.subCategory.forEach(function (a) {
            target.subCategory.some(function (b) {
                return fuse(b, a);
            }) || (target.subCategory = target.subCategory.concat(source.subCategory));
        });
        return true;
    }
}

var obj1 = { "name": "Services", "category": "Services", "subCategory": [{ "name": "Negative", "category": "Negative", "subCategory": [{ "name": "Expensive", "val": 109, "subCategory": null }] }] },
    obj2 = { "name": "Services", "category": "Services", "subCategory": [{ "name": "Negative", "category": "Negative", "subCategory": [{ "name": "Disorganized", "val": 25, "subCategory": null }] }] };


fuse(obj1, obj2);
document.write('<pre>' + JSON.stringify(obj1, 0, 4) + '</pre>');
&#13;
&#13;
&#13;