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

时间:2015-02-12 18:16:56

标签: javascript angularjs underscore.js

我正在编写一个小型的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语句(如上例所示),就会从数组中删除所有对象。

3 个答案:

答案 0 :(得分:2)

我认为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/

答案 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 ) 
      );
    });
 };