正在检测对象数组中是否存在属性值

Detecting if a property value exists in an array of objects

本文关键字:是否 存在 属性 数组 检测 对象      更新时间:2024-05-28

我正在尝试检查容器"EntityGroup"对象的"members"数组中是否已存在具有特定"ID"的"member"对象。为什么以下EntityGroup.idExists(id)不起作用:

EntityGroup = function() {
    this.members = []; // intention is for this to hold 'Entity' objects
    this.classType = null; // what class of entities does it hold
};
EntityGroup.prototype = {
    addEntity: function(entityType, EntityID) {
        // TODO implement .idExists() check here 
        // dont add new member if the id does exist
        this.members.push(new Entity(entityType, EntityID))
    },
    idExists: function(EntityID) {
        var idExists = false,
            member, 
            members = this.members;
        for (member in members) {
            if (EntityID == member.EntityID) {
                idExists = true;
                break;
            } else {
                continue;
            }
        }
        return idExists;
    }
};
Entity = function(entityType, EntityID) {
    this.EntityID = EntityID;
    this.entityType = entityType;
};
g = new EntityGroup();
g.addEntity("Person", 1);
g.addEntity("Person", 2);
console.log(g.idExists(1)); // returns false which is not expected
console.log(g.members); 

for (x in y)不是遍历数组中对象的正确构造。它只用于遍历对象的键。

因此,member变量引用的不是两个Entity对象,而是分别为12的对象的索引。迭代这些对象的正确方法是:

for(var i = 0; i < members.length; i++) {
    EntityID == members[i].EntityID;
}

问题出在for...in循环上。您应该只在迭代对象中的属性时使用for...in,而不是通过数组的项。

如果你用以下内容替换这个循环,你应该没问题:

for(var i=0,len=members.length; i<len; ++i){
     var member = members[i];
     //the rest