2016-01-06 44 views
1

我想推入一個新的項目進入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)); 
     } 
    } 
+0

你能告訴我們favlist和項目的價值? – jbrown

+0

此刻是2,並且項目只有一個對象! (我添加了額外的代碼) – CWHsu

回答

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)); 
} 
+0

補充:D我只是要回答同樣的事情!你擊敗了我。 Upvoting這個答案。 – Jorrex

+0

謝謝你們=) – CWHsu

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

相關問題