避免在键值结构JS中重复记录

时间:2016-05-24 01:34:43

标签: javascript angularjs

来自菜鸟的简单问题。

我有这个例子,我创建一个带有键/值结构的列表,我使用Id作为键,其余内容是值,所以如果我添加更多记录,它们将被添加到我的列表 $ scope.itemList []

var data = [
              {
                id: 1,
                name : "Peter",
                lastname : "Smith",
                age : 36
              }, {
                id: 2,
                name : "Peter",
                lastname : "Smith",
                age : 36
              }
            ];

            $scope.itemList = [];
            angular.forEach(data, function(item){
                var obj = {};
                var valObj = {};

                valObj.name = item.name;
                valObj.lastname = item.lastname;
                valObj.age = item.age;

                obj[item.id] = valObj;
                $scope.itemList.push(obj);
            });

问题是我可以在我的json中使用相同的ID创建更多记录,并且我希望避免添加重复的记录,现在这个代码将推送它所带来的一切,如果id是重复的,但我不知道如何将var obj {}与item.id进行比较,我尝试了不同的“选项”,但没有一个工作。

对此的一些帮助将会很棒,我会非常感激

2 个答案:

答案 0 :(得分:1)

解决方案

var data = [
  {
    id: 1,
    name : "Peter1",
    lastname : "Smith",
    age : 36
  }, {
    id: 2,
    name : "Peter2",
    lastname : "Smith",
    age : 36
  }, {
    id: 2,
    name : "Peter3",
    lastname : "Smith",
    age : 36
  }
];

$scope.itemList = [];
angular.forEach(data, function(item){
  var obj = {};
  var valObj = {};

  valObj.name = item.name;
  valObj.lastname = item.lastname;
  valObj.age = item.age;

  if ( !obj[item.id]) {
    obj[item.id] = valObj;
    $scope.itemList.push(obj);
  }

});

但是如果你没有一个很好的理由obj [item.id]那么你应该看看lodash的findIndex或类似的东西。

我的意思是我无法找到你必须拥有2个单独对象的原因。

<强>更新

var data = [
  {
    id: 1,
    name : "Peter1",
    lastname : "Smith",
    age : 36
  }, {
    id: 2,
    name : "Peter2",
    lastname : "Smith",
    age : 36
  }, {
    id: 2,
    name : "Peter3",
    lastname : "Smith",
    age : 36
  }
];

$scope.itemsList = [];
angular.forEach(data, function(item){
  if(_.findIndex($scope.itemsList, function(itemList){ return item.id === itemList.id }) === -1){
    $scope.itemsList.push(item);
  }
});

答案 1 :(得分:1)

如果您将itemList从列表更改为字典,我认为它可以满足您的需求。类似的东西:

var data = [
              {
                id: 1,
                name : "Peter",
                lastname : "Smith",
                age : 36
              }, {
                id: 2,
                name : "Peter",
                lastname : "Smith",
                age : 36
              }
            ];

            $scope.itemDictionary = {};
            angular.forEach(data, function(item){
                var obj = {};
                var valObj = {};

                valObj.name = item.name;
                valObj.lastname = item.lastname;
                valObj.age = item.age;

                obj[item.id] = valObj;
                if(!$scope.itemDictionary[item.id]){
                     $scope.itemDictionary[item.id] = obj;
                }
            });