带有 IndexOf 的下划线拒绝函数从数组中删除所有对象

Underscore reject Function with IndexOf removes all objects from array

我正在编写一个小型 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;
  }
});
};

如你所见,我正在设置一个计数器,如果在索引中找到关键字,则将其添加到计数器中,然后在最后检查计数器 return true 或 false 以删除数组中的对象。 $scope.posts 是包含我的数据的对象数组,$scope.keywords 是用户输入。我想查找来自 $scope.posts.author 对象和 $scope.posts.id 对象的输入。

如果我删除其中一个 if 语句,该函数将按预期执行:所有与关键字不匹配的内容都会从数组中删除。但是,一旦我向函数添加另一个 if 语句(如我上面的示例所示),所有对象都会从数组中删除。

在我看来 filter 可能更适合这里:

$scope.posts = _.filter($scope.posts, function(p) {
  return $scope.keywords.indexOf(p.author) > -1 || $scope.keywords.indexOf(p.id) > -1;
});

工作示例:http://jsfiddle.net/4xp3sm10/

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

不需要使用那样的整数

由于您要拒绝行,因此您需要确保所有条件都为真。您的代码只是检查其中一个是否为真。

 $scope.search = function() {
    $scope.posts = _.reject($scope.posts, function(p) {
      return (
           ($scope.keywords.indexOf(p.author) < 0 ) &&
           ($scope.keywords.indexOf(p.id) < 0 ) 
      );
    });
 };