it-swarm.com.ru

Angularjs проверяет, существует ли передаваемое значение в массиве

Я пытаюсь передать два значения текстового поля в массив и использовать AngularJS, но я также хочу проверить, существует ли уже переданное первое значение в массиве. Если это не так, я не хочу, чтобы его снова добавляли, если он не существует, добавьте значения Я могу заставить его добавить значения, но я застреваю, пытаясь проверить, существует ли уже значение фамилии в массиве. Я нашел несколько примеров, которым пытался следовать, но не могу заставить их работать. Спасибо за любую помощь!

<div class="panel-body">
    <div ng-controller="TodoCtrl">
        <ul>
            <li li ng-repeat="todo in todos">
            {{todo.text}}, {{todo.name}}
            </li>
        </ul>
        <form class="form-horizontal">
        <input type="text" ng-model="formTodoLast" ng-model-instant>
        <input type="text" ng-model="formTodoFirst" ng-model-instant>
        <button class="btn" ng-click="addTodo()"><i class="icon-plus"></i>Add</button>
    </div>
</div>

todo.js

function TodoCtrl($scope) { 
    $scope.todos = [];

    $scope.addTodo = function () {

    if($scope.todos.indexOf(text:$scope.formTodoLast) == -1) {
        $scope.todos.Push({text:$scope.formTodoLast, name:$scope.formTodoFirst});
        $scope.formTodoText = ' ';
        $scope.formTodoName = ' ';
        }
    }
}
6
Trevor

Как сказал Крейг, вам нужно перебрать массив как таковой

var addToArray=true;
for(var i=0;i<$scope.todos.length;i++){
    if($scope.todos[i].text===$scope.formTodoLast){
        addToArray=false;
    }
}
if(addToArray){
    $scope.todos.Push({text:$scope.formTodoLast, name:$scope.formTodoFirst});
}
$scope.formTodoText = ' ';
$scope.formTodoName = ' ';
15
NicolasMoise

Кажется, в вашем фрагменте есть синтаксическая ошибка. Если вы предпочитаете однострочную версию в выражении if, Измените условие if на:

function TodoCtrl($scope) { 
    $scope.todos = [];

    $scope.addTodo = function () {

    if(!$scope.todos.some(function(td){return td.text===$scope.formTodoLast})) {
        $scope.todos.Push({text:$scope.formTodoLast, name:$scope.formTodoFirst});
        $scope.formTodoText = ' ';
        $scope.formTodoName = ' ';
        }
    };
}

Array.prototype.some возвращает true, если какой-либо элемент соответствует требованию

some () выполняет функцию обратного вызова один раз для каждого элемента, присутствующего в массив, пока не найдет тот, где обратный вызов возвращает истинное значение. Если такой элемент найден, some () немедленно возвращает true . https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/some

9
ssnau

Это «$ scope.todos.indexOf (text: $ scope.formTodoLast)» не будет работать. Вы должны пройти через массив и проверить свойство formTodoLast каждого объекта. Или, если вы используете полный jQuery, вы можете использовать grep ().

Вот пример, обратите внимание, что сравнение сейчас чувствительно к регистру. Если это длинный список, рассмотрите возможность использования цикла for Javascript вместо forEach в Angular, вы можете выйти из цикла for, и он, вероятно, будет быстрее.

function TodoCtrl($scope) { 
    $scope.todos = [];

    $scope.addTodo = function () {

        var missingName = true;
        angular.forEach($scope.todos, function(value, key){
           if(value.formTodoLast == $scope.formTodoLast)
           {
               missingName = false;
           }
         });

        if(missingName) {
            $scope.todos.Push({text:$scope.formTodoLast, name:$scope.formTodoFirst});
            $scope.formTodoText = ' ';
            $scope.formTodoName = ' ';
        }
    }
}
2
Craig Squire