2017-02-14 34 views
1

我有兩個數組。我可以通過單擊searchWords中的單詞來推送和拼接,這會在當前的詞表中添加或刪除單詞。比較兩個數組和concat沒有重複

我想要的是一個按鈕,可將所有searchWords轉移到currentWordlist,而不會覆蓋實際在currentWordlist上的單詞。

我想出了這個代碼:

$scope.addAll = function() { 
    var searchWords = []; 
    var currentWords = []; 

    // safes all searchwords to the array 
    for (var i = 0; i < $scope.searchWords.length; i++) { 
     searchWords.push($scope.searchWords[i]); 
    } 

    // safes all currentwords to the array 
    for (var j = 0; j < $scope.currentWordlist.length; j++) { 
     currentWords.push($scope.currentWordlist[j]); 
    } 

    console.log("searchWords " + searchWords.length); 
    console.log("currentWords " + currentWords.length); 

    angular.forEach(searchWords, function(value1, key1) { 
     angular.forEach(currentWords, function(value2, key2) { 
     if (value1._id !== value2._id) { 
      $scope.currentWordlist.push(value1); 
     } 
     }); 
    }); 
    }; 

我經過兩個陣列的和安全的他們,這樣我可以使用裏面我的兩個angular.forEach,以檢查是否有重複的陣列。如果我不推送到當前詞表。但它不起作用。我得到一個[ngRepeat:dupes]錯誤,但我不能使用$ index索引,因爲否則從列表中刪除將刪除錯誤的單詞。我認爲我在這裏做了嚴重錯誤的事情,但是我無法找出到目前爲止(幾小時的試驗和錯誤:0)

+0

考慮使用的indexOf – MMK

回答

3

我建議使用帶有ng-repeat指令的角度unique過濾器。該代碼可能如下:

$scope.addAll = function() { 
    // use angular.copy to create a new instance of searchWords 
    $scope.combinedWords = angular.copy($scope.searchWords).concat($scope.currentWordlist); 
}; 

然後在您的視圖:

<div ng-repeat="word in combinedWords | unique:'_id'"> 
    {{word}} 
</div> 

用法:

colection | uniq: 'property' 

它也可以通過嵌套的屬性進行過濾:

colection | uniq: 'property.nested_property' 
+1

這確實的伎倆,美觀大方,流暢。非常感謝您提供有關過濾器的信息! – d8ta

2

你可以簡單地這樣做

angular.forEach($scope.searchWords, function(value1, key1) { 
     var temp=true; 
     angular.forEach($scope.currentWordlist, function(value2, key2) { 
     if (value1.id === value2.id) 
      temp=false; 
     }); 
     if(temp) 
     $scope.currentWordlist.push(value1); 
    }); 

var app = angular.module("app", []); 
 
app.controller("ctrl", function($scope) { 
 
    
 
    $scope.searchWords=[{id:1,name:'A'},{id:2,name:'B'},{id:1,name:'A'},{id:4,name:'D'}]; 
 
    $scope.currentWordlist=[]; 
 
    $scope.addAll = function() { 
 
    
 
    angular.forEach($scope.searchWords, function(value1, key1) { 
 
     var temp=true; 
 
     angular.forEach($scope.currentWordlist, function(value2, key2) { 
 
     if (value1.id === value2.id) 
 
      temp=false; 
 
     }); 
 
     if(temp) 
 
     $scope.currentWordlist.push(value1); 
 
    }); 
 
    
 
    console.log($scope.currentWordlist); 
 
    }; 
 

 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="app" ng-controller="ctrl"> 
 
    <button ng-click="addAll(newWord)">Add</button> 
 
    <div>{{currentWordlist}}</div> 
 
</div>

+0

這是一個很好的工作解決方案,謝謝! – d8ta