如何检查数组中是否存在对象

时间:2016-03-25 23:58:05

标签: javascript arrays javascript-objects

我试图只向数组添加唯一的命名对象(没有重复项),为了做到这一点,我必须先检查对象是否已存在于数组中。不幸的是,我的所有尝试都不断向数组中添加重复的对象。我可以逐个检查每个对象的数组,看看我想要添加的对象是否已经在数组中,如果是,我什么都不做。所以,我正在检查我的item.ORG和数组中对象名称之间的匹配。这有助于查看它是否匹配,但如果它不匹配,我不想将新对象添加到数组中,因为它可能与更远的对象相匹配阵列。我下面的最新尝试也不起作用。

//constructor for OrgObj that goes in ORRArr
function OrgObj(itemOrg) {
    this.name = itemOrg;
    this.count = 0;
    this.url_status_list = [];
}

var ORGArr = [];

$.each(_items, function(index, item) {
            var weFoundIt = true;

            if (ORGArr.length === 0) {
                ORGArr.push(new OrgObj(item.ORG));
            } else {
                for (var i = 0; i < ORGArr.length; i++) {
                    if (item.ORG === ORGArr[i].name) {
                        break;
                    } else {
                        weFoundIt = false; {

                        }
                    }
                    if (weFountIt === false) {
                        ORGArr.push(new OrgObj(item.ORG));
                    }
                });

2 个答案:

答案 0 :(得分:0)

在循环中,您应该将weFoundIt初始化为false,并且只有在找到它时才将其设置为true。同时将检查放在循环后面,最后一个条件(fount而不是found)中也会出现拼写错误。这是一个工作示例:https://jsfiddle.net/y4b80wcc/

较短的替代方案是https://jsfiddle.net/xdwzfghr/1/

if(ORGArr.map(function(x){return x.name;}).indexOf(item.ORG) === -1) {
    ORGArr.push(new OrgObj(item.ORG))
}

答案 1 :(得分:0)

我会使用filter方法。

//constructor for OrgObj that goes in ORRArr
function OrgObj(itemOrg) {
  this.name = itemOrg;
  this.count = 0;
  this.url_status_list = [];
}

var ORGArr = [];
var _items = [new OrgObj('A'), new OrgObj('B'), new OrgObj('C'), new OrgObj('B'), new OrgObj('B'), new OrgObj('A'), new OrgObj('D')]


var foundNamesLookup = {};
ORGArr = _items.filter(function(item) {
  if (foundNamesLookup [item.name]) {
    return false;
  }
  foundNamesLookup [item.name] = true;
  return true;
});

console.log(ORGArr);

编辑:https://jsfiddle.net/yoy0s7cL/(请参阅控制台中的结果)