使用jQuery测试数组中是否存在具有属性的对象

3

请问有什么最好的方法可以检查包含在对象数组中的对象是否具有type11

以下是我目前拥有的内容,但它将为数组中的每个对象触发警报,我可以检查整个数组并仅在最后一次警报吗?

我看到了像grep这样的方法,但是我一直在尝试却无法让它工作。 我正在使用jQuery。

var x;
for (x = 0; x < objects.length; x++) {

    if (objects[x].type == 11) {
        alert("exists");
    } else {
        alert("doesnt exist");
    }
}

你使用的东西有什么问题吗? - Brian Cray
@BrianCray 他/她正在每次迭代中发出警报。 - Popnoodles
2
我曾经看到过像grep这样的方法,但是我一直在尝试,却无法使其工作。下面是如何使用grep(): var existGrep = jQuery.grep(objects, function(item) { return(item.type === 11); }); 我只是加入了这个例子来展示如何使grep()起作用,但当然任何其他答案都更合适/高效,例如使用Array.some或使用break,因为grep()会遍历整个数组。 - Nope
5个回答

4

最好的方法是使用Array.some:

var exists = objects.some(function(el) { return el.type === 11 });

链接中还有一个适用于不支持它的浏览器的填充程序。

否则,您只需要迭代:

var exists = false;
for (var i = 0, el; !exists && (el = objects[i++]);)
    exists = el.type === 11;

一旦你设置了exists变量,你可以直接执行以下操作:
if (exists) {
    // do something
}

在循环外,无论哪种情况。

3

你的代码应该实现它。如果你担心 循环 会无用地继续下去,你可以通过调用 break; 来中止它。

if(objects[x].type == 11){
    alert("exists");
    break;
 }

1
将其转化为一个函数:
function hasObjWithType11(arr) {
    var x;
    for (x = 0; x < arr.length; x++) {
        if(arr[x].type == 11){
            return true;
        }
    }
    return false;
}

alert(hasObjWithType11([{type:1}, {type:11}]); // alerts true

1
这会做到它。
var exists = false;
for (var x = 0; x < objects.length; x++) {
     if(objects[x].type == 11){
       exists = true;
       break;
     }
}
if(exists){
    alert("exists");
}

不需要else语句,在循环之前已经将其声明为false了。 - Daryl Ginn

1
你可以将搜索代码封装成一个单独的函数,使其更加可重用。这样,你就可以将条件外部化,以便更轻松地阅读:
function array_contains(a, fn)
{
    for (i = 0, len = a.length; i < len; ++i) {
        if (fn(a[i])) {
            return true;
        }
    }
    return false;
}

if (array_contains(objects, function(item) { return item.type == 11; })) {
    alert('found');
}

你也可以使用 Array.some()
if (objects.some(function(item) {
  return item.type == 11;
})) {
    alert('exists');
}

对于IE < 9,参考MDN文档中的模拟版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接