2017-02-21 6 views
1

Below einfädelt meine Json gespeichert in:Der Versuch, zwei Arrays

$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, 
    } 
    ] 
} 

Dies ist meine andere json in gespeichert:

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

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

Jetzt möchte ich $ scope.regionList um $ scope fusionieren .regs, aber für die Datensätze, die sowohl in $ scope.regionList als auch in $ scope.regions übereinstimmen, möchte ich Datensätze von $ scope.regions durch $ scope.regionList ersetzen (nur gemeinsame Datensätze aus beiden Listen).

Und erste nicht passenden Datensätze von $ scope.regionList wird, um höchstwertige verwenden, haben beginnen und halten für jede nicht-passenden Datensätze Erhöhen so die endgültige Ausgabe wie unten sein wird:

Erwartete Ausgabe:

"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, 
    } 

wie ABC ist, ist die erste nicht passende Datensatz, so dass es andere Ordnung 3 und Rest hat, erhält man keine Reihenfolge von 3, dh 4,5 6 usw.

Mein Code:

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)

Antwort

2

Sie könnten eine Hash-Tabelle verwenden und für die Aktualisierung es mit den Elementen des Arrays aufzubauen.

Dann iterieren Sie regions und aktualisieren Sie rank entweder mit dem Hash rank oder mit highestOrder. Inkrementieren highestOrder nach dem Zuweisen.

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 für Ihre freundlichen Bemühungen in Richtung zum Helfen me.I mit Id mehrere Regionen habe = 100 und 101 so, wenn ich für Region id = 100 dann das wollen? –

+0

Was passiert mit 'highestOrder' für' id = 101'? –

+0

Ich werde Region Liste für jede Region mit ID = 100.101 und höchste Reihenfolge wird nur für 1 Region zu einer Zeit.so gerade jetzt Ich würde gerne nur für regiion = 100 –