删除重复项并合并JSON对象

时间:2014-10-07 10:29:40

标签: javascript json

我有以下JSON对象。我需要删除重复项并使用纯Javascript合并内部对象。我该怎么做呢?

[{
    "id" : 1,
    "name" : "abc",
    "nodes" :[
        {
            "nodeId" : 20,
            "nodeName" : "test1"
        }
    ]
},
{
    "id" : 1,
    "name" : "abc",
    "nodes" :[
        {
            "nodeId" : 21,
            "nodeName" : "test2"
        }
    ]
}]

以下是我期望作为输出的对象。

[{
    "id" : 1,
    "name" : "abc",
    "nodes" :[
        {
            "nodeId" : 20,
            "nodeName" : "test1"
        },
        {
            "nodeId" : 21,
            "nodeName" : "test2"
        },
    ]
}]

问候。

Shreerang

2 个答案:

答案 0 :(得分:3)

首先将JSON转换为Javascript数组,以便您可以轻松访问它:

var arr = JSON.parse(json);

然后为结果创建一个数组并循环遍历项目并与结果中的项目进行比较:

var result = [];

for (var i = 0; i < arr.length; i++) {
  var found = false;
  for (var j = 0; j < result.length; j++) {
    if (result[j].id == arr[i].id && result[j].name == arr[i].name) {
      found = true;
      result[j].nodes = result[j].nodes.concat(arr[i].nodes);
      break;
    }
  }
  if (!found) {
    result.push(arr[i]);
  }
}

然后,如果这是您需要的最终结果,则可以从数组中创建JSON:

json = JSON.stringify(result);

答案 1 :(得分:0)

如果您的字符串被称为输入,那么:

var inter = {};
for (var i in input) {
    if (!inter.hasOwnProperty(input[i].name)) {
        inter[input[i].name] = input[i].nodes;
        inter[input[i].name].name = input[i].name;
        inter[input[i].name].id = input[i].id;
    }
    else
        inter[input[i].name] = inter[input[i].name].concat(input[i].nodes)
}

导致:     { “ABC”:[{ “的NodeId”:20, “nodeName的”: “测试1”},{ “节点ID”:21, “nodeName的”: “TEST2”}]}

你可以看到我是如何使用由匹配标准键入的中间对象。你问的是它是一个对象而不是一个数组,但无论如何你都可以迭代它。事实上,对于这种结构,你可能比你要求的阵列更好。

顺便说一句,我把几个文本命名的属性:“id”和“name”塞进了一个数组。它们不会出现在JSON.stringify中,但它们就在那里。