我有一个小应用程序,用户可以使用它来搜索电影,然后将其添加到他们的监视列表中。目前,可以为同一用户多次添加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
这显然是重复的结果。
答案 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.movies - 是传递给过滤器的电影列表。您可以 根据您的需要发送任何列表。
{movie_id:$ scope.existingMovie.movie_id} - 这一个是对象 我们需要找到哪一个。这可以根据您的需要而定。因为我们 正在搜索 movie_id ,我们需要发送带有属性的对象 和价值。 {movie_id:$ scope.existingMovie.movie_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的新数组中。
简单的长度检查将确定是否需要写入记录。
我希望这有助于某人。