2017-02-21 15 views
1

をマージしようとすると、中に格納されて私のJSONされています。今、私は$スコープへの$ scope.regionListをマージしたい二つの配列の下

$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.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です.regionsしかし、$ scope.regionListと$ scope.regionsの両方で一致するレコードについては、$ scope.regionsのレコードを$ scope.regionList(両方のリストの共通レコードのみ)に置き換えたいと思います。

と$ scope.regionListから最初の非一致するレコードは、最終的な出力は以下のようになるためhighestOrderの使用を開始し、各非マッチングレコードをインクリメントし続ける必要があります:

予想される出力:

ABCがあるよう
"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, 
    } 

それは順番3を有し、他の残りの部分であろうように、第1の非マッチングレコードがNO 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またはhighestOrderのいずれかでrankを更新します。割り当て後に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のでme.Iは、ID = 100および101と、複数の領域を有する午前助けることへのあなたの親切な努力のための私は、地域のid = 100のためにこれにしたい場合は? –

+0

'id = 101'の' highestOrder'はどうなりますか? –

+0

id = 100,101の各地域の地域リストがあり、一番高い注文は一度に1つの地域のみになります 私はregiion = 100について検討したいと思います –