我想合并两个包含json对象的数组,但通过在键之前添加一些文本来保留重复的键。在下面的示例中,来自对象json2的数据正在覆盖对象json1,因为它们具有相同的键,但是我也想保留来自第一个对象的数据。谢谢。

var json1 = [
  {
    "Column1": "json1",
    "Column2": "json1",
  },
  {
    "Column1": "json1",
    "Column2": "json1",
  }
];
var json2 = [
  {
    "Column1": "json2",
    "Column2": "json2",
  },
  {
    "Column1": "json2",
    "Column2": "json2",
  }
];

console.log(angular.extend(json1, json2));


回来了

[
  {
    "Column1": "json2",
    "Column2": "json2",
  },
  {
    "Column1": "json2",
    "Column2": "json2",
  }
];


但是我想要

[
  {
    "json1Column1": "json1",
    "json1Column2": "json1",
    "json2Column1": "json2",
    "json2Column2": "json2",
  },
  {
    "json1Column1": "json1",
    "json1Column2": "json1",
    "json2Column1": "json2",
    "json2Column2": "json2",
  }
];

最佳答案

我唯一能想到的就是创建一个为对象添加前缀的函数:

function addPrefix(target, prefix){
    var newObj = false;
    if(target.constructor === Array){
        newObj = [];
        for(var i = 0 ; i< target.length; i++){
            item = target[i];
            var itemObj = {};
            for(var key in item){
                itemObj[prefix+key] = item[key];
            }
            newObj.push(itemObj);
        }
    }else{
        newObj = {};
        for(var key in target){
                newObj[prefix+key] = target[key];
        }
    }
     return newObj;
}


之后,避免使用angular.extend,它不支持深层属性复制。这就是为什么将第二个对象的属性复制到第一个对象的原因。您需要的是angular.merge,因此您的代码将在实现先前的功能之后进行:

var nJson1=addPrefix(json1,"json1");
var nJson2=addPrefix(json2,"json2");
var merged = angular.merge({},nJson1,nJson2);

09-10 11:05
查看更多