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

时间:2012-07-30 00:07:20

标签: javascript arrays oop prototype exists

我正在尝试检查容器'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); 

2 个答案:

答案 0 :(得分:3)

for (x in y)不是迭代数组中对象的正确构造。它仅用于迭代对象的键。

所以发生的事情是,Entity变量不是获取两个member对象,而是指那些分别为12的对象的索引。 。迭代这些对象的正确方法是:

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

答案 1 :(得分:3)

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

如果用以下内容替换此循环,则应该没问题:

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