Angularjs 如何检查值是否已经存在?

Angularjs 如何检查值是否已经存在?,angularjs,Angularjs,我有一个小应用程序,用户可以使用它搜索电影,然后将其添加到他们的观看列表中。目前,可以为同一用户添加1个电影倍增时间。这当然不是预期的行为 我的解决方案是找到正在添加的电影的唯一id,并与我的movies\u用户数据进行交叉检查。如果movie\u id值存在,则执行此操作,否则执行此操作 目前,我确实拥有正在添加的电影的唯一电影id $scope.movieListID = response; console.log ($scope.movieListID.id) 像字符串一样输出,就像这样

我有一个小应用程序,用户可以使用它搜索电影,然后将其添加到他们的观看列表中。目前,可以为同一用户添加1个电影倍增时间。这当然不是预期的行为

我的解决方案是找到正在添加的电影的唯一id,并与我的
movies\u用户
数据进行交叉检查。如果
movie\u id
值存在,则执行此操作,否则执行此操作

目前,我确实拥有正在添加的电影的唯一电影id

$scope.movieListID = response;
console.log ($scope.movieListID.id)
像字符串一样输出,就像这样

314365
我从当前用户那里得到了电影记录

$scope.moviesCheck = response.data;
console.log ($scope.moviesCheck)
看起来像这样

[{"id":2,"title":"Black Panther", "movie_id":"284054"}]
那么,有什么好方法可以检查
$scope.movieListID.id
的结果是否已经存在于
$scope.moviesCheck
数据中

*更新*

尝试下面的建议不会得到预期的结果

var exists = function (id) {
  $scope.moviesCheck.forEach(function (movie) {
    console.log (movie.movie_id)
    console.log (id)
    if (movie.movie_id === id)
      console.log ('duplicate')
    else
      console.log ('not duplicate')

  });
}

exists($scope.movieListID.id);
此文件的console.log输出为

312221
312221
not duplicate

这显然是重复的结果。

您可以在控制器中添加一个功能,以检查列表中是否存在电影

var exists = function (id) {
    $scope.moviesCheck.forEach(function (movie) {
        if (movie.id === id)
            return true;
    });

    return false;
}

// and call it
exists($scope.movieListID.id); // true or false

从您的问题中我了解到,基于对象数组中使用id存在的对象,您必须执行不同的操作

您可以为此使用$filter。为控制器注入筛选器并将其分配给作用域。因此,这将是可用的,只要你想在这个控制器

$sope.movies-是传递到筛选器的电影列表。你可以 根据您的需要发送任何列表

{movie\u id:$scope.existingMovie.movie\u id}-这是一个对象 我们需要找到哪一个。这可以基于您的需要。自从我们 正在搜索电影\u id,我们需要发送带有属性的对象 和价值。{movie\u id:$scope.existingMovie.movie\u id},这里是movie\u id 属性,后跟带冒号的值

true:这表示要搜索精确匹配的值。默认情况下 这是错误的。如果设置为false,那么如果要搜索54 在电影id中,这将返回包含54的对象 作为价值的一部分

app.controller('controller',['$filter',函数($filter){ $scope.cFilter=$filter

           $scope.Exists=function(){
 $scope.movies=[{"id":2,"title":"Black Panther", "movie_id":"284054"},{"id":3,"title":"Black Panther", "movie_id":"32343"},{"id":4,"title":"Black Panther", "movie_id":"98863"}]

$scope.existingMovie={"id":3,"title":"Black Panther", "movie_id":"32343"};

var _obj=$scope.cFilter('filter')($scope.movies, {movie_id:$scope.existingMovie.movie_id}, true);
                if(_obj && _obj[0])
                {
                  Console.log('object exists')
                }
               else
               {
                 Console.log('Object is not found')
               }
            }

        }])

我不是100%认为这是一个很好的方法,但对我来说,它很有效,而且我认为它的性能相当低

movieService.loadMovies().then(function(response) {
  $scope.moviesCheck = response.data;

  var arr = $scope.moviesCheck
  function myIndexOf(o) {
      for (var i = 0; i < arr.length; i++) {
          if (arr[i].movie_id == o.exisitingMovie_id) {
              return i;
          }
      }
      return -1;
  }
  var checkDuplicate = (myIndexOf({exisitingMovie_id:movie.id}));

  if (checkDuplicate == -1) {
movieService.loadMovies().then(函数(响应){
$scope.moviesCheck=response.data;
var arr=$scope.moviesCheck
函数myIndexOf(o){
对于(变量i=0;i
非常感谢Jeeva Jsb。这让我走上了正确的道路,不过我想我会用一个实际的例子来说明,这个例子似乎和预期的一样有效

因此,我有一个名为getData的函数,它获取AJAX数组,但在添加到范围之前,我们需要检查记录是否存在(否则我们会得到重复的记录)

此行通过过滤作用域($scope.notifications)中的现有数组并从您的交互中传入相同的值来创建一个新数组

如果该值存在,则该对象将被复制到名为doesExist的新数组中

简单的长度检查将确定是否需要写入记录


我希望这对某人有所帮助。

谢谢你的建议。我马上就要尝试一下,不过要问一个简短的问题。你认为forEach会对浏览器速度产生多大影响吗?不过我并不期望有太多的电影效果。forEach会改为native for。for循环的速度始终比forEach快40多倍。@CaptainMat我试过你的建议,但没有达到预期效果。我在问题中给出了示例和结果。它是一个字符串和一个数字吗?如果是,尝试使用just==而不是===Yea似乎是这样。恐怕我不理解这段代码背后的逻辑。你使用filter,id作为值,但我看不出你在过滤什么。哟你有_obj作为示例变量吗?我已经用通用格式编写了。现在你可以看到,我已经修改了代码。现在$scope.movies是movie的集合。不要使用三重相等。在值相同且类型相同之前,结果不会为真。例如,1==“1”将生成真。但是1==“1”不会生成true。请检查此项。这看起来也不错。每个高级代码都在内部实现此项。但如果要使用相同的方法反复编写,则代码大小将增加。与其他方法相比没有太大不同。如果要使用更少的代码,请使用angular native的$filter。
movieService.loadMovies().then(function(response) {
  $scope.moviesCheck = response.data;

  var arr = $scope.moviesCheck
  function myIndexOf(o) {
      for (var i = 0; i < arr.length; i++) {
          if (arr[i].movie_id == o.exisitingMovie_id) {
              return i;
          }
      }
      return -1;
  }
  var checkDuplicate = (myIndexOf({exisitingMovie_id:movie.id}));

  if (checkDuplicate == -1) {
                    if (d.data.length) {
                    for (var i = 0; i < d.data.length; i++) {

                        var doesExist = $filter('filter')($scope.notifications, {NotifId:d.data[i].NotifId}, true);

                        if (doesExist.length == 0){
                            $scope.notifications.push(d.data[i]);
                        }                         
                    }
                }
var doesExist = $filter('filter')($scope.notifications, {NotifId:d.data[i].NotifId}, true);