在推送之前检查重复的项目

时间:2014-12-01 09:19:30

标签: arrays json angularjs duplicate-removal

早上好,

我想将新项目推送到数组(我们可以做),但在推送检查重复项之前,以防止重复数组中的项目。

我已尝试过此 example ,但未成功我无法使用我们的代码。

如果有人知道更好的解决方案,或者可以看到我们出错的地方,请尽快告诉我们。 谢谢。

** JS **

 $scope.Products = $scope.$storage.Products == undefined ? [] : $scope.$storage.Products;
 $scope.logItem = function($index, brandName, partNumber, productName, amount) {

     $scope.newItem = {
         Brand: brandName,
         Part: partNumber,
         Product: productName,
         Amount: amount
     };

     var duplicateItem = $scope.Products.reduce(function(previous, i) {
         if ($scope.newItem === i) return true;
         return previous
     }, false);

     if (duplicateItem) {
         alert("Already Logged");
     } else {
         alert("Item Logged");
         $scope.Products.push($scope.newItem);
         $scope.$storage.Products = $scope.Products;
     }


 }

** FIX **

$scope.Products = $scope.$storage.Products == undefined ? [] : $scope.$storage.Products;
$scope.logItem = function($index, brandName, partNumber, productName, amount) {
    $scope.newItem = {
        Brand: brandName,
        Part: partNumber,
        Product: productName,
        Amount: amount
    };
    var isDuplicate = false;
    $scope.Products.forEach(function(element) {
        if (JSON.stringify(element) === JSON.stringify($scope.newItem)) {
            isDuplicate = true;
            return false;
        }
    });
    if (!isDuplicate) {
        alert("Item Logged");
        $scope.Products.push($scope.newItem);
        $scope.$storage.Products = $scope.Products;
    } else {
        alert("Already Logged");
    };

}

4 个答案:

答案 0 :(得分:5)

像这样的东西

$scope.Products.forEach(function (element) {
    if (JSON.stringify(element) === JSON.stringify($scope.newItem)) {
        isDuplicate = true;
        return false;
    }
});

Look fiddle

答案 1 :(得分:3)

您可以随时检查推送到阵列是否安全。

if ($scope.ITEMS.indexOf(ITEM) == -1) {
  // SAFE
  $scope.ITEMS.push(ITEM);
}

答案 2 :(得分:1)

http://jsfiddle.net/u8Fuk/24/

您可以使用unique过滤器。为此,你需要为angularui添加dependecy, 然后你可以简单地做

ng-repeat="item in items | unique:'item' "

答案 3 :(得分:1)

此外,您可以在underscore.js中使用_.reject或_.filter函数来防止基于条件的重复值