2016-10-05 56 views
-2

我想將數據發送到數組而不存在現有對象。這裏是 的代碼。在Angularjs中使用indexOf找不到數組中的現有對象

result.then(function (speaker) { //getting response from the modal 
    var speakerdatanew = {_id: speaker._id, name: speaker.name, email: speaker.email}; 
    if ($scope.speakerdata.indexOf(speakerdatanew._id) === -1) { 
    $scope.speakerdata.push(speakerdatanew); 
    console.log($scope.speakerdata); 
    } else { 
    alert("You have already added speaker");  
    } 
}); 

它連續多次添加相同的數據。

+0

因此,對象數組中的_id的索引總是不存在。你正在比較_id和對象;這不起作用。 –

+0

你不能用indexOf檢查一個具有多個屬性的對象。而是迭代$ scope.speakerdata並對迭代的第i個元素執行相同的檢查。 –

+0

如果數組是一個對象數組,那麼只有通過'indexOf'對象纔有意義。它會發現它,如果你通過'indexOf'參考數組中的一個項目。它不能是數組中的對象*,它必須是對數組中實際對象的引用。你可能想'Array#some'。 'Array#find'是另一種選擇,如果你知道用戶有一個合理的新瀏覽器。 – doug65536

回答

0

你可以使用array.find方法通過_id

if (!$scope.speakerdata.find(function(s) { return s._id === speakerdatanew._id)) { 
    $scope.speakerdata.push(speakerdatanew); 
    console.log($scope.speakerdata); 
} 
+0

你能否詳細說明一下? – swamy

+0

添加示例 –

+0

Internet Explorer中不支持'Array.find'。 'Array.some'總是適用於小改動。 – doug65536

0

對象數組不同的比特找到一個揚聲器。這是非AngularJS,只是簡單的JavaScript。

function myIndexOf(myArray, searchTerm, property) { 
    for (var i = 0; i < myArray.length; i++) { 
    if (myArray[i][property] === searchTerm) return i; 
    } 
    return -1; 
} 

使用

if(myIndexOf($scope.speakerdata, speakerdatanew , "_id")===-1){ 

還有其他的選擇,但是這是一個簡單的例子。

注意我自私地拉從另一個答案,我創建了一個有一個鏈接到一個更復雜的一個刪除對象,查找,lookupall的例子。 Multidimensional array vs array of objects

在某些時候,它可能會使用庫或調查這些選項的選項,儘管這些選項在較舊的瀏覽器中可行 - 而且我在那些不得不支持這些瀏覽器的情況下對性能進行了一些測試。

0

對於這個問題陳述有很多可能的答案,但我已經採取了更簡單的方法,我可以在每個檢查對象是否存在的步驟執行不同的操作。下面是您的問題的示例片段。

你甚至可以使用angular.forEach爲迭代名單

angular.forEach($scope.speakerdata, function(val, key) { 

      }); 

但對於沒有休息設施或繼續在該關鍵字,所以我沒有用。

.result.then(function (speaker) { //getting response from the modal 
     var speakerdatanew = { 
      _id: speaker._id, 
      name: speaker.name, 
      email: speaker.email 
     }; 

     var alreadyPresent = false; 
     for (var i = 0; i < $scope.speakerdata.length; i++) { 
      var speakerData = $scope.speakerdata[i]; 
      if (speakerData._id == speakerdatanew._id) { 
       alreadyPresent = true; 
       break; 
      } else { 

      } 
     } 
     if (alreadyPresent) { 
      alert("You have already added speaker"); 
     } else { 
      $scope.speakerdata.push(speakerdatanew); 
      console.log($scope.speakerdata); 
     }