【问题标题】:Can't find existing object in an array using indexOf in Angularjs在Angularjs中使用indexOf在数组中找不到现有对象
【发布时间】:2016-10-05 13:18:26
【问题描述】:

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

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

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

【问题讨论】:

  • 所以,对象数组中_id的索引总是不存在的。您正在将 _id 与对象进行比较;那是行不通的。
  • 您不能使用 indexOf 检查具有多个属性的对象。而是迭代 $scope.speakerdata 并对迭代的第 i 个元素进行相同的检查。
  • 如果数组是一个对象数组,那么只有传递indexOf一个对象才有意义。如果您传递indexOf 对数组中某个项目的引用,它将找到它。它不能是数组中 like 的对象,它必须是对数组中实际对象的引用。你可能想要Array#someArray#find 是另一个选择,如果你知道用户有一个相当新的浏览器。
  • 其实我是 Angular 的新手,你能详细说明一下吗? @Angular_10
  • 我建议你使用 lodash 或 underscorejs

标签: javascript angularjs


【解决方案1】:

您可以使用array.find的方法找到_id的演讲者

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

【讨论】:

  • 您能详细说明一下吗?
  • Array.find 在 Internet Explorer 中不受支持。 Array.some 总是能做一些小的改动。
【解决方案2】:

这个问题陈述有很多可能的答案,但我采用了更简单的方法,我可以在检查对象是否存在的每个步骤中执行不同的操作。下面是您的问题的示例 sn-p。

您甚至可以使用angular.forEach 来迭代列表

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

            });

但是没有使用 break 或 continue 关键字的功能,所以我没有使用。

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

【讨论】:

    【解决方案3】:

    对象数组略有不同。这不是 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

    在某些时候,它可能有助于使用库或研究这些选项,尽管这些在旧浏览器中确实有效 - 我对那些必须支持这些的旧浏览器的性能进行了一些测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-16
      相关资源
      最近更新 更多