2017-02-21 5 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 в долл объеме .регионы, но для тех записей, которые соответствуют как в объектах $ scope.regionList, так и в $ scope.regions, я хотел бы заменить записи $ scope.regions на $ scope.regionList (только общие записи из обоих списков).

И первый не совпадающие записи от $ 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, 
    } 

в АВС является первым не соответствующая запись поэтому он будет иметь порядок 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 либо с hash's rank, либо с highestOrder. Приращение 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, так что если я хочу, чтобы это для области ид = 100 тогда? –

+0

Что происходит с 'highOrder' для' id = 101'? –

+0

У меня будет список регионов для каждого региона с id = 100,101, и самый высокий заказ будет доступен только для 1 региона за один раз.so прямо сейчас Я бы хотел рассмотреть только для regiion = 100 –

Смежные вопросы