2017-02-21 57 views
1

下面是存储在我的JSON:试图合并两个数组

$scope.regions = []; 

{ 
    "id": 100, 
    "regions": [ 
    { 
     "id": 10, 
     "name": "Abc", 
     "rank": 0, 
    }, 
    { 
     "id": 20, 
     "name": "Pqr", 
     "rank": 1, 
    }, 
    { 
     "id": 30, 
     "name": "Lmn", 
     "rank": 2, 
    }, 
    { 
     "id": 40, 
     "name": "xyz", 
     "rank": 3, 
    }, 
    { 
     "id": 50, 
     "name": "GGG", 
     "rank": 4, 
    }, 
    { 
     "id": 60, 
     "name": "YYY", 
     "rank": 5, 
    } 
    ] 
} 

它被保存在我的另一个JSON:

$scope.regionList = []; 
var highestOrder = 3; 

    "regions": [ 
    { 
     "id": 40, 
     "name": "xyz", 
     "rank": 0, 
    }, 
    { 
     "id": 50, 
     "name": "GGG", 
     "rank": 1, 
    }, 
    { 
     "id": 60, 
     "name": "YYY", 
     "rank": 2, 
    } 

现在我要到$范围合并$ scope.regionList .regions,但在$ scope.regionList和$ scope.regions匹配的记录我想用$ scope.regionList(只有两个列表中的常见记录)替换$ scope.regions的记录。从$ scope.regionList

而且第一个非匹配的记录将有秩序开始使用highestOrder,并会不断增加每个不匹配的记录,使最终输出的将是如下图所示:

预期输出:

"regions": [ 
    { 
     "id": 10, 
     "name": "Abc", 
     "rank": 3, 
    }, 
    { 
     "id": 20, 
     "name": "Pqr", 
     "rank": 4, 
    }, 
    { 
     "id": 30, 
     "name": "Lmn", 
     "rank": 5, 
    }, 
    { 
     "id": 40, 
     "name": "xyz", 
     "rank": 0, 
    }, 
    { 
     "id": 50, 
     "name": "GGG", 
     "rank": 1, 
    }, 
    { 
     "id": 60, 
     "name": "YYY", 
     "rank": 2, 
    } 

为abc是是第一个非匹配的记录,以便将有3阶和休息等将具有顺序没有从3即4,5 6等

我的代码:

var highestOrder = 3; 
var found = false; 

for (var i = 0; i < $scope.regions.length; i++) { 
    if ($scope.regions[i].id == 100) { 
     found = true; 
     for (var j = 0; j < $scope.regionList.length; j++) { 
      for (var k = 0; k < $scope.regions[i].regions.length; k++) { 
      if ($scope.regions[i].regions[k].id == $scope.regionList[j].id) { 
        $scope.regions[i].regions[k].rank = $scope.regionList[j].rank; 
      } 
      else { 
        $scope.regions[i].regions[k].rank = highestOrder; 
        highestOrder = highestOrder + 1; 
       } 
     } 
    } 
    } 
    if (found) 
     break; 
} 

var regions = { 
 
    "id": 100, 
 
    "regions": [{ 
 
     "id": 10, 
 
     "name": "Abc", 
 
     "rank": 0, 
 
    }, 
 
    { 
 
     "id": 20, 
 
     "name": "Pqr", 
 
     "rank": 1, 
 
    }, 
 
    { 
 
     "id": 30, 
 
     "name": "Lmn", 
 
     "rank": 2, 
 
    }, 
 
    { 
 
     "id": 40, 
 
     "name": "xyz", 
 
     "rank": 3, 
 
    }, 
 
    { 
 
     "id": 50, 
 
     "name": "GGG", 
 
     "rank": 4, 
 
    }, 
 
    { 
 
     "id": 60, 
 
     "name": "YYY", 
 
     "rank": 5, 
 
    } 
 
    ] 
 
} 
 
var highestOrder = 3; 
 
var found = false; 
 
var regionList = [{ 
 
    "id": 40, 
 
    "name": "xyz", 
 
    "rank": 0, 
 
    }, 
 
    { 
 
    "id": 50, 
 
    "name": "GGG", 
 
    "rank": 1, 
 
    }, 
 
    { 
 
    "id": 60, 
 
    "name": "YYY", 
 
    "rank": 2 
 
    } 
 
] 
 

 
for (var i = 0; i < regions.length; i++) { 
 
    if (regions[i].id == 100) { 
 
    found = true; 
 
    for (var j = 0; j < regionList.length; j++) { 
 
     for (var k = 0; k < regions[i].regions.length; k++) { 
 
     if (regions[i].regions[k].id == regionList[j].id) { 
 
      regions[i].regions[k].rank = regionList[j].rank; 
 
     } else { 
 
      regions[i].regions[k].rank = highestOrder; 
 
      highestOrder = highestOrder + 1; 
 
     } 
 
     } 
 
    } 
 
    } 
 
    if (found) 
 
    break; 
 
} 
 
console.log(regions)

回答

2

你可以使用一个哈希表,并与阵列用于更新的元素构建它。

然后重复regions并更新rank与散列的rankhighestOrder。分配后增加highestOrder

var $scope = { regions: [{ id: 100, regions: [{ id: 10, name: "Abc", rank: 0, }, { id: 20, name: "Pqr", rank: 1, }, { id: 30, name: "Lmn", rank: 2, }, { id: 40, name: "xyz", rank: 3, }, { id: 50, name: "GGG", rank: 4, }, { id: 60, name: "YYY", rank: 5, }] }] }, 
 
    regionsUpdate = [{ id: 40, name: "xyz", rank: 0, }, { id: 50, name: "GGG", rank: 1, }, { id: 60, name: "YYY", rank: 2, }], 
 
    regionsId = 100, 
 
    highestOrder = 3, 
 
    hash = Object.create(null); 
 

 
regionsUpdate.forEach(function (a) { 
 
    hash[a.id] = a; 
 
}); 
 

 
$scope.regions.some(function (a) { 
 
    if (a.id === regionsId) { 
 
     a.regions.forEach(function (b) { 
 
      b.rank = hash[b.id] ? hash[b.id].rank : highestOrder++; 
 
     }); 
 
     return true; 
 
    } 
 
}); 
 

 
console.log($scope);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Upvoted您对帮助我,我很一条id = 100和101多个地区,所以如果我想这对于区域ID = 100,然后样的努力? –

+0

'highestOrder'为'id = 101'发生了什么? –

+0

我将有地区列表为每个区域与id = 100,101和最高顺序将只为一个地区的时间.so现在 我想考虑只有区域= 100 –