Javascript 检查具有索引的对象是否在数组中

Javascript 检查具有索引的对象是否在数组中,javascript,jquery,arrays,object,each,Javascript,Jquery,Arrays,Object,Each,其中,结构是一个对象数组,每个对象都有一个唯一的名称地图[ii]。建筑物是包含其中一些对象的数组。我想迭代构造中的每个对象,检查其名称参数是否出现在映射[ii].建筑的对象中 如果map[ii].buildings数组中的每个元素只是对象名称的文本字符串,但如果元素是整个对象,则上述代码不起作用。。关闭,但没有骰子>尝试使用$.grep()而不是$.inArray();您可以指定一个函数来执行筛选 不是检查-1,而是检查$.grep()返回的数组是否具有length==0 简单示例:(如果您发布

其中,
结构
是一个对象数组,每个对象都有一个唯一的名称<代码>地图[ii]。建筑物是包含其中一些对象的数组。我想迭代
构造
中的每个对象,检查其名称参数是否出现在
映射[ii].建筑
的对象中

如果
map[ii].buildings
数组中的每个元素只是对象名称的文本字符串,但如果元素是整个对象,则上述代码不起作用。。关闭,但没有骰子>尝试使用
$.grep()
而不是
$.inArray()
;您可以指定一个函数来执行筛选

不是检查-1,而是检查
$.grep()
返回的数组是否具有
length==0

简单示例:(如果您发布“构造”对象的代码/示例会更容易)

var构造=[{
名称:“餐厅大厅”,
平方英尺:5000
}, {
名称:“医务室”,
平方英尺:2000
}, {
名称:“平房”,
平方英尺:2000
}, {
名称:"总部",,
平方英尺:2000
}];
var建筑物=[{
名称:“医务室”,
平方英尺:2000
}, {
名称:"总部",,
平方英尺:2000
}];
//找到的建筑将是“建筑”中不在“建筑”中的项目列表
var foundBuildings=$.grep(构造、功能(构造项){
return$.grep(建筑物、功能(建筑物项目){
return buildingsItem.Name==constructionsItem.Name
}).length==0;//==0表示“不在”,而>0表示“在”
});
//这只会让你觉得结果很好
$。每个(建筑物、功能(idx,项目){
$(“#输出”).append(“+item.Name+”);
});

非jQuery的方法是使用
过滤器。大概是这样的:

$.each(constructions, function(i,v) { 
if ($.inArray(v.name, map[ii].buildings) == -1) {//stuff}
};

您甚至可以向阵列原型添加新方法。使用这个函数,您可以使用简单数组,如果传入键,也可以使用对象数组。注意:在本例中,我将
map
filter
替换为执行相同功能但更快的循环(请参见注释):

函数获取值(arr,键){
var out=[];
对于(变量i=0,l=arr.length;i

$.inArray()
相比,
$.grep()
对您更有效吗?您是要检查建筑物的唯一对象ID,还是在两个不同的数组中确实有相同的对象?@没有必要原来是同一个对象,但建筑物中对象的其他值会发生变化,因此它会很快变得不同,但始终具有相同的名称。这看起来不错。。。但我应该更清楚,我怎样才能让建筑物成为建筑物中的物体,而不是建筑物中的物体?在上下文中,游戏将检查每个建筑是否存在于数组中,如果不存在,则列出它们。我认为您只需将
true
作为第三个参数传递给
$.grep()
,这将反转结果。请参阅jQuery文档了解grep:。您可能想重写循环结构。似乎不起作用,我对您的代码所做的编辑就在这里-感觉很接近tho>。更新了代码和fiddle链接,请立即尝试。对于不在
结构中的项目,基本上检查
length==0
,对于在
结构中的项目,基本上检查
length>0
。刚刚意识到应该将变量名更改为
notFoundBuildings
;)没问题,这只是您的标准集差分操作,可以在
constructions
中找到作为
建筑物
相对补充的集。是的,Array.filter()是一个好东西。第二个示例在未传递任何键时运行正常,但在其他情况下运行稍慢()。为什么要为对象的键创建额外的数组?由于这些函数返回的是字符串数组而不是对象数组,因此调用者无论如何都需要从对象的键中查找对象,对吗?@没什么需要的,谢谢您的回复。那很有趣。如果我消除
过滤器
映射
并用简单的循环替换它们,那么上面提到的原型替换方法。
// pass in an array and the key for which you want values
// it returns an array of those values
function getValues(arr, key) {
  return arr.map(function (el) { return el[key]; });
}

function notFoundIn(arr, arr2) {

  // grab the names of the buildings
  var buildings = getValues(arr2, 'name');

  // grab the names from the construction objects and filter
  // those that are not in the building array
  return getValues(arr, 'name').filter(function (el) {
    return buildings.indexOf(el) === -1;
  });
}

notFoundIn(constructions, buildings); // eg [ "one", "three" ]
function getValues(arr, key) {
  var out = [];
  for (var i = 0, l = arr.length; i < l; i++) {
    out.push(arr[i][key]);
  }
  return out;
}

if (!Array.prototype.notFoundIn) {
  Array.prototype.notFoundIn = function (inThisArray, key) {
    var thisArr = key ? getValues(this, key) : this;
    var arrIn = key ? getValues(inThisArray, key) : inThisArray;
    var out = [];
    for (var i = 0, l = thisArr.length; i < l; i++) {
      if (arrIn.indexOf(thisArr[i]) === -1) {
        out.push(thisArr[i]);
      }
    }
    return out;
  }
}


constructions.notFoundIn(buildings, 'name');
[1, 2, 3].notFoundIn([2]); // [1, 3]