加入2个JSON数组,只进行匹配

时间:2014-07-28 21:46:58

标签: javascript arrays json

我有2个JSON数组,两者都可以包含嵌套数组:

var serverArr = [
              { "id": 1, "text": "Item 1" },
              { "id": 2, "text": "Item 2" },
              { "id": 3, "text": "Item 3", "children": [{ "id": 20, "text": "Item 20" },
                                                        { "id": 21, "text": "Item 21" }] },
              { "id": 4, "text": "Item 4" }
           ];

var userArr = [
                 { "id": 1, "text": "Item 1" },
                 { "id": 3, "text": "Item 3", "children": [{ "id": 20, "text": "Item 20" },
                                                           { "id": 25, "text": "Item 25" }] },
                 { "id": 5, "text": "Item 5" }
              ];

我需要做的是将它们组合成一个数组,只获取匹配值。所以结果应该是这样的:

 [{ "id": 1, "text": "Item 1" },
  { "id": 3, "text": "Item 3", "children": [{ "id": 20, "text": "Item 20" }]}];

我正在使用jsTree插件的结果,所以格式必须是这样的。

如何从这两个数组中获得最终结果?

1 个答案:

答案 0 :(得分:0)

我已经定义了一个函数来完成3件事来解决这个问题

  • 首先它获取两个数组中的所有元素,并收集两个数组中每个项目的所有子元素

  • 第二件事是过滤所有子元素以仅保留唯一的元素

  • 第三件事是更改父元素的子元素以仅保留唯一元素

        function combine(array1,array2)
        {
    
            result = serverArr.concat(userArr);
            var childs = [];
    
            // First step
    
            result = result.filter(function(elem, index, self) 
            {
                if(elem.children != undefined)
                    childs[elem.id] = ((childs[elem.id] == undefined) ? [] : childs[elem.id]).concat(elem.children);
                for (key in self) 
                    if(key < index && elem.id == self[key].id )
                        return true;
                return false;
            });
    
            // Second step
    
            for(i in childs)
                childs[i] = childs[i].filter(function(elem, index, self)
                {
                    for (key in self) 
                        if(key < index && JSON.stringify(elem) == JSON.stringify(self[key]) )
                            return true; 
                    return false;
                });
    
            //Third step
    
            for(key in result)
                if(childs[result[key].id] != undefined)
                    result[key].children = childs[result[key].id];
    
            return result;
        }