仅推送一个项目而不是按下对象的数量

时间:2016-01-06 14:51:00

标签: javascript arrays angularjs ionic

我正在尝试将新项目推送到favlist中,我使用for循环检查该项目是否已存在于favlist中。

但是,不是一次按下新项目,而是推送重复数量的新项目。

解决这个问题的最佳方法是什么?

提前致谢!

$scope.favlist = JSON.parse($window.localStorage.getItem("favlist"));
    console.log($scope.favlist);

    $scope.toggleStar = function(item) {
      item.star = !item.star;
      console.log(item); //object


      var favlistcontent = $window.localStorage.getItem("favlist");
        console.log(favlistcontent); //string

        if(typeof favlistcontent !== 'string'){
         $scope.favlist = [];
         $window.localStorage.setItem("favlist",JSON.stringify($scope.favlist));
       }
       $scope.favlist = JSON.parse($window.localStorage.getItem("favlist"));
      console.log($scope.favlist); //object
      console.log($scope.favlist.length);

      console.log(angular.equals($scope.favlist[0],item)); //true
      for(i=0; i<$scope.favlist.length; i++){
        if(angular.equals($scope.favlist[i],item)){
          console.log("item already exists");


       }
       else {
        $scope.favlist.push(item);
        $window.localStorage.setItem("favlist",JSON.stringify($scope.favlist));
      }
    }

2 个答案:

答案 0 :(得分:2)

一旦找到相同的项目,你需要打破循环,否则它将继续并在检查不相等的项目时添加项目。

var duplicate = false;


for (i = 0; i < $scope.favlist.length; i++) {
    if (angular.equals($scope.favlist[i], item)) {
        console.log("item already exists");
        //break loop here
        duplicate = true;
        break;
    }

}

if (!duplicate){
    $scope.favlist.push(item);
    $window.localStorage.setItem("favlist", JSON.stringify($scope.favlist));
}

答案 1 :(得分:1)

解决此问题的最佳方法是使用:

  if($scope.favlist.indexOf(item)==-1){
    // item is no duplicate
    $scope.favlist.push(item);
    $window.localStorage.setItem("favlist", JSON.stringify($scope.favlist));
  }

支票看起来更简单。 在一个好的浏览器中,indexOf函数总是比“手动”循环更快。

见基准:https://jsperf.com/js-for-loop-vs-array-indexof/10