我正在尝试使用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 = ' ';
}
}
}
答案 0 :(得分:15)
正如克雷格所说,你需要像这样循环遍历数组
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 = ' ';
答案 1 :(得分:9)
您的代码段中似乎存在语法错误。如果您更喜欢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
答案 2 :(得分:2)
这个“$ scope.todos.indexOf(text:$ scope.formTodoLast)”不起作用。您必须遍历数组并检查每个对象的formTodoLast属性。或者,如果使用完整的jQuery,则可以使用grep()。
这是一个例子,注意比较现在是区分大小写的。如果它是一个长列表,请考虑使用Javascript for
循环而不是Angular的forEach
,您可以跳出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 = ' ';
}
}
}