在Angularjs中使用indexOf无法在数组中找到现有对象

时间:2016-10-05 13:18:26

标签: javascript angularjs

我想将数据发送到没有现有数据的数组。这里是 代码。

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");    
  }
});

它不断多次添加相同的数据。

3 个答案:

答案 0 :(得分:0)

您可以使用array.find方法按_id

查找发言人
if (!$scope.speakerdata.find(function(s) { return s._id === speakerdatanew._id)) {
    $scope.speakerdata.push(speakerdatanew);
    console.log($scope.speakerdata); 
} 

答案 1 :(得分: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

在某些时候,可能会使用库或调查这些选项,尽管这些可以在旧浏览器中使用 - 我在那些必须支持这些浏览器的旧浏览器中进行了一些性能测试。

答案 2 :(得分: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);
        }