Javascript:for..in循环运行的次数比预期的多

在下面的代码中,user.roles的实际长度是1.但是,循环运行两次。

当我输出i的值时,第二次迭代显示为“diff”。 切换到普通的for循环解决了这种情况。 但是,我想知道for..in循环的问题是什么。

for (var i in user.roles) { if (user.roles[i].school.equals(schoolId)) { for (var j in user.roles[i].permissions) { for (var k in accessType) { if (user.roles[i].permissions[j].feature == featureKey) { if (user.roles[i].permissions[j][accessType[k]]) { return true; } } } } } } 

更新:用户是一个对象,angular色是一个对象数组。 导致此问题的angular色实例如下所示:

 { "_id": "582d3390d572d05c1f028f53", "displayName": "Test Teacher Attendance", "gender": "Male", "roles": [ { "_id": "57a1b3ccc71009c62a48a684", "school": "57a1b3ccc71009c62a48a682", "role": "Teacher", "__v": 0, "designation": true, "permissions": [ { "feature": "User", "_id": "57ac0b9171b8f0b82befdb7d", "review": false, "view": true, "delete": false, "edit": false, "create": false }, { "feature": "Notice", "_id": "57ac0b9171b8f0b82befdb7c", "review": false, "view": true, "delete": false, "edit": false, "create": false }, ] } ], } 

user.roles似乎是一个数组。 而对于数组,你不应该使用in。

简单的例子

 var arr = [2]; arr.s = 3; for (var i in arr) { console.log("here"); // paints twice } 

从MDN开始 , for … in语句以任意顺序迭代对象的可枚举属性。 对于每个不同的属性,可以执行语句。

如何select迭代器的types,这里是一个引用迭代器

编辑

根据更新后的问题,如果代码后面的某个地方存在,上面的代码只能带有diff属性

 Array.prototype.diff = ..... 

我想这是你在找什么。 我假设你的accessTypes是一个包含下列项目的数组:

var accessTypes = ["review", "view", "delete", "edit", "create"];

编辑提高效率。

 var schoolId = "57a1b3ccc71009c62a48a682"; var featureKey = "Notice"; var accessTypes = ["review", "view", "delete", "edit", "create"]; var user = { "_id": "582d3390d572d05c1f028f53", "displayName": "Test Teacher Attendance", "gender": "Male", "roles": [{ "_id": "57a1b3ccc71009c62a48a684", "school": "57a1b3ccc71009c62a48a682", "role": "Teacher", "__v": 0, "designation": true, "permissions": [{ "feature": "User", "_id": "57ac0b9171b8f0b82befdb7d", "review": false, "view": true, "delete": false, "edit": false, "create": false }, { "feature": "Notice", "_id": "57ac0b9171b8f0b82befdb7c", "review": false, "view": true, "delete": false, "edit": false, "create": false }] }] }; user.roles.forEach(function(roleItem) { // console.log('This is a role: ' + roleItem.school); if (roleItem.school == schoolId) { roleItem.permissions.forEach(function(permissionItem) { // console.log('This is a permission: ' + permissionItem.feature); // console.log('This is a accessType: ' + accessType); if (permissionItem.feature == featureKey) { accessTypes.forEach(function(accessType) { if (permissionItem[accessType]) { console.log('accessType: ' + accessType + ' -> true'); return true; } }); } }); } });