关于javascript:检查元素是否存在于数组中而不迭代它

Checking if element exists in array without iterating through it

我的数组:

1
tempListArray ="[{"id":"12","value":false},{"id":"10","value":false},{"id":"9","value":false},{"id":"8","value":false}]";

要检查元素是否存在,我将执行以下操作:

1
2
3
4
5
6
7
for (var i in tempListArray) {
    //check flag
    if (tempListArray[i].id == Id) {
        flagExistsLoop = 1;
        break;
    }
}

不管怎样,我可以在不循环整个数组的情况下检查ID是否存在。基本上,如果说我有100个元素,我会担心性能。

谢谢


不,如果不迭代数组,就无法知道这一点。

但是,注意,for...in循环是迭代数组的一种糟糕方法:

  • 不保证它将按顺序迭代数组
  • 它还将迭代(可枚举)非数字自身属性
  • 它还将迭代(可枚举)来自原型的属性,即在Array.prototypeObject.protoype中定义的属性。

我将使用其中一个:

  • 带数字索引的for循环:

    1
    2
    3
    4
    5
    6
    for (var i=0; i<tempListArray.length; ++i) {
        if (tempListArray[i].id == Id) {
            flagExistsLoop = 1;
            break;
        }
    }
  • Array.prototype.some(ecmascript 5):

    1
    2
    3
    var flagExistsLoop = tempListArray.some(function(item) {
        return item.id == Id;
    });

    注意,它可能比其他的慢,因为它在每个步骤调用一个函数。

  • for...of环(ecmascript 6):

    1
    2
    3
    4
    5
    6
    for (var item of tempListArray) {
        if (item.id == Id) {
            flagExistsLoop = 1;
            break;
        }
    }

不,如果不使用自定义字典对象(您真的不想这样做),就没有比对所有包含的对象进行"完全扫描"更快的方法了。

作为一般经验法则,不要担心任何语言或任何情况下的性能,直到迭代总数达到5位,通常是6位或7位。扫描一张包含100个元素的表最坏应该是几毫秒。在您注意到性能影响之前担心性能影响是最糟糕的过早优化类型之一。


根据您的场景,您可能可以使用array.indexof(),如果该项不存在,它将返回-1。

当然,它可能是在后台迭代,但代码要干净得多。还要注意如何在javascript中进行对象比较,其中两个对象不相等,即使它们的值可能相等。见下文:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var tempListArray = [{"id":"12","value":false},{"id":"10","value":false},{"id":"9","value":false},{"id":"8","value":false}];

var check1 = tempListArray[2];
var check2 = {"id":"9","value":false};

doCheck(tempListArray, check1);
doCheck(tempListArray, check2);

function doCheck(array, item) {
  var index = array.indexOf(item);
 
  if (index === -1)
    document.write("not in array<br/>");
  else
    document.write("exists at index" + index +"<br/>");
}


不迭代元素是不可能的(那将是魔法)。

但是,您可以考虑使用对象而不是数组。对象将使用(可能是唯一的)id值作为键,该值可以具有与现在相同的结构(或没有多余的id属性)。这样,您就可以有效地确定id是否已经存在。


尝试使用php.js,它可以帮助您使用相同的php函数名,并且具有一些有用的功能。