如何检查值是否已存在?

时间:2015-12-12 11:35:24

标签: angularjs

我有一个小应用程序,用户可以使用它来搜索电影,然后将其添加到他们的监视列表中。目前,可以为同一用户多次添加1部电影。哪种行为不是预期的行为。

我的解决方案是找到正在添加的电影的唯一ID,并使用我的movies_users数据进行交叉检查。如果存在movie_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

这显然是重复的结果。

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

从你的问题我明白,基于对象数组中使用id存在的对象,你必须做不同的动作。

  

您可以使用$ filter来实现此目的。为控制器注入过滤器并将其分配给范围。所以只要你想在这个控制器中就可以使用它。

$scope.cFilter('filter')($scope.movies, {movie_id:$scope.existingMovie.movie_id}, true);
  

$ sope.movi​​es - 是传递给过滤器的电影列表。您可以   根据您的需要发送任何列表。

     

{movie_id:$ scope.existingMovie.movi​​e_id} - 这一个是对象   我们需要找到哪一个。这可以根据您的需要而定。因为我们   正在搜索 movie_id ,我们需要发送带有属性的对象   和价值。 {movie_id:$ scope.existingMovie.movi​​e_id},这里是movie_id   属性,后跟冒号的值。

     

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

app.controller('controller',['$ filter',function($ 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')
               }
            }

        }])

答案 2 :(得分:0)

如果这是一个很好的方法,我不是百分之百,但对我来说它是有效的,我认为它的性能非常低,

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) {

答案 3 :(得分:0)

非常感谢Jeeva Jsb。这让我走上正轨,但是我想我会用一个似乎按预期工作的实际例子来澄清。

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

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

这应该看起来比较熟悉......

当我们迭代返回的AJAX对象时,我们需要检查(在我的情况下通知)的ID

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

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

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

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

我希望这有助于某人。