2015-02-12 2 views
0

У меня есть небольшое угловое приложение, которое я пишу, использующее Underscore для просмотра каждого объекта в массиве и удаления объекта, если оно не соответствует ключевому слову (пользовательский ввод).Underscore reject Функция с IndexOf удаляет все объекты из массива

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

Как вы можете видеть, я устанавливаю счетчик, а затем добавить к прилавку, если ключевое слово находится в индексе, то в конце проверки счетчика вернуть истинным или ложным, чтобы удалить объект из массив. $scope.posts - это массив объектов с моими данными и $scope.keywords - это пользовательский ввод. Я хочу найти вход от объекта $scope.posts.author и объект $scope.posts.id.

Если я удаляю один из операторов if, функция выполняет как ожидалось: все, не соответствующие ключевому слову, удаляются из массива. Однако, как только я добавлю еще одну оператору if (как показано в моем примере выше), ВСЕ объекты удаляются из массива.

+0

Будет ли «фильтровать» лучшее совпадение для такого рода вещей? –

+0

'keywords' - это строка – stephenthedev

ответ

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/

+0

Лучше выглядящий код, но я получаю тот же результат, что и в моем примере. Все объекты удалены. Если я удалю логический оператор, а второй проверит его работу, как и ожидалось. – stephenthedev

+0

Привет, Стивен. Я немного обновил свой код и предоставил рабочий пример. Надеюсь это поможет. –

+1

Одно изменение, которое я бы сделал, - это присвоить результаты другой переменной (например, $ scope.searchResults') вместо перезаписи источника данных '$ scope.posts'. – nickgraef

0

Вместо фильтра или отклонить это было бы еще проще сделать это в обратном направлении, используя _. где

var newArray = _.where($scope.posts, {keyword : $scope.keyword}); 

Там вы идете, одна линия.

Edit:

Если вы застряли делать это так, вот так, как вы могли очистить его немного.

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

Нет необходимости использовать целое число, как, что

+0

Почтовые объекты не имеют свойства ключевого слова для сопоставления. – nickgraef

+0

заполните его тем, что нужно, это просто пример. – ribsies

0

Поскольку вы отвергаете строки, которые вы будете хотеть, чтобы убедиться, что все условия. Ваш код просто проверяет, чтобы он был прав.

$scope.search = function() { 
    $scope.posts = _.reject($scope.posts, function(p) { 
     return (
      ($scope.keywords.indexOf(p.author) < 0) && 
      ($scope.keywords.indexOf(p.id) < 0) 
    ); 
    }); 
}; 
Смежные вопросы