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]