3

有人可以告诉我检查对象数组中的对象是否具有的最佳方法type11

下面是我所拥有的,但它会对数组中的每个对象发出警报,我可以检查整个数组并让它在最后只发出一次警报吗?

我见过像 grep 这样的方法,但我一直在尝试,但无法让它发挥作用。我正在使用 jQuery。

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

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

5 回答 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
}

在循环之外,在这两种情况下。

于 2013-02-15T00:36:56.193 回答
3

您的代码实际上应该这样做。如果您担心循环将无用地继续,您可以通过调用来中止它break;

if(objects[x].type == 11){
    alert("exists");
    break;
 }
于 2013-02-15T00:16:32.840 回答
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
于 2013-02-15T00:16:30.097 回答
1

这会做到的

var exists = false;
for (var x = 0; x < objects.length; x++) {
     if(objects[x].type == 11){
       exists = true;
       break;
     }
}
if(exists){
    alert("exists");
}
于 2013-02-15T00:18:16.460 回答
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 文档以获取模拟版本。

于 2013-02-15T00:20:36.797 回答