我正在使用angular.js 1.5和前端的角度材质来加载DOM和数据库中的对象。
在其中一个转发器中,我需要检查一个对象是否已经包含在另一个范围内的javascript数组中。我尝试使用Array.indexOf()
和Array.forEach
进行此操作,并在每个元素上循环标准循环,但它不会按照我需要的方式发生。我必须做一些愚蠢的事情,以防止逻辑正常运行。理想情况下,如果当前对象存在于数组中,则方法应返回false,否则返回true。
用例是用户需要将项目 ObjA 添加到另一个列表(Objs)的列表(ObjX.Objs)
我的前端HTML代码:
//here there's an object that contains an array of objects
<div ng-controller="myFirstController" ng-init="findOne()">
<md-list-item ng-repeat="ObjA in ObjX.Objs" >
</md-list-item>
<div ng-controller="mySecondcontroller" ng-init="find()">
<md-list-item ng-repeat="ObjA in Objs" ng-if="ObjAExists(ObjA, ObjX.Objs)">
</md-list-item>
</div>
</div>
控制器方法:
$scope.ObjAExists = function(ObjA, list){
for(var m = 0; m<list.length; m++){
if(list[m] === ObjA){
return false;
}
else return true;
}
}
我也尝试匹配对象Id没有区别
$scope.ObjAExists = function(ObjA, list){
for(var m = 0; m<list.length; m++){
if(list[m]._id == ObjA._id){
return false;
}
else return true;
}
}
Filter skills plunk 我写了一个代表相同问题的插件
答案 0 :(得分:2)
您只需将ObjA
与列表中的第一个元素进行比较。您应该从return true;
循环中取出for
。
它将是:
$scope.ObjAExists = function(ObjA, list){
for(var m = 0; m<list.length; m++){
if(list[m]._id == ObjA._id){
return false;
}
}
return true;
}
*方法的名称当然应该是..NotExists
此处example通过评论回答了您的问题。注意:
friend.skills
与我们通常skills list
的对象不同。这就是name
属性进行比较的原因。filter
代替ng-if
过滤&#34;使用&#34;会更清晰技能清单答案 1 :(得分:1)
在您的代码中
<ul>
<li ng-repeat="friend in friends">
<li ng-repeat="skill in skills" ng-if="skillExists(skill,friend.skills)">{{skill.name}}
</li>
</ul>
li
tage不能直接在另一个li
标记下使用。因为您使用这种方式friend.skill
将无法定义,这就是skillExists
无效的原因之一。
根据我的经验,我现在使用skillExists
方法,我建议您不要直接比较两个对象。始终尝试使用id
或某些unique attribute
来区分每个对象,并且该密钥应该用于对象比较。所以在这里你应该使用name
属性而不是比较整个对象。
您的代码
if(list[i]===skill){
return false;
}
而不是使用
if(list[i].name === skill.name){
return false;
}
以下是工作示例的链接。 https://plnkr.co/edit/mvskLPsTH8eJv6OfPFsB