试图合并两个数组

时间:2017-02-21 13:43:57

标签: javascript

以下是我的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.regions中,但对于那些在$ scope.regionList和$ scope.regions中匹配的记录,我想用$ scope替换$ scope.regions的记录.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,
    }

由于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)

1 个答案:

答案 0 :(得分:2)

您可以使用哈希表并使用数组元素构建它以进行更新。

然后使用哈希值regionsrank迭代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; }