我正在编写一个小型的Angular应用程序,它使用Underscore来查看数组中的每个对象,如果它与关键字(用户输入)不匹配,则删除该对象。
$scope.search = function() {
$scope.posts = _.reject($scope.posts, function(p) {
var i = 0;
if ($scope.keywords.indexOf(p.author) < 0 ) {
i++;
}
if ($scope.keywords.indexOf(p.id) < 0 ) {
i++;
}
if(i > 0) {
return true;
}
});
};
正如您所看到的,我正在设置一个计数器,然后如果在索引中找到关键字,则添加到计数器,然后在结束时检查计数器以返回true或false以从数组中删除该对象。 $scope.posts
是包含我的数据的对象数组,$scope.keywords
是用户输入。我想查找来自$scope.posts.author
对象和$scope.posts.id
对象的输入。
如果我删除了if
语句之一,该函数按预期执行:从数组中删除与该关键字不匹配的所有内容。但是,只要我向函数添加另一个if
语句(如上例所示),就会从数组中删除所有对象。
答案 0 :(得分:2)
我认为filter
可能更适合这里:
$scope.posts = _.filter($scope.posts, function(p) {
return $scope.keywords.indexOf(p.author) > -1 || $scope.keywords.indexOf(p.id) > -1;
});
答案 1 :(得分:0)
使用_.where
以相反的方式更容易做到,而不是过滤或拒绝var newArray = _.where($scope.posts, {keyword : $scope.keyword});
你去,一行。
修改强>
如果您坚持这样做,可以通过以下方式清理它。
$scope.posts = _.reject($scope.posts, function(p) {
var check = false;
if ($scope.keywords.indexOf(p.author) < 0 ) {
check = true;
}
if ($scope.keywords.indexOf(p.id) < 0 ) {
check = true;
}
if(i > 0) {
return check;
}
});
};
无需使用类似
的整数答案 2 :(得分:0)
由于您拒绝行,因此您需要确保所有条件都为真。您的代码只是检查其中一个是否为真。
$scope.search = function() {
$scope.posts = _.reject($scope.posts, function(p) {
return (
($scope.keywords.indexOf(p.author) < 0 ) &&
($scope.keywords.indexOf(p.id) < 0 )
);
});
};