检查元素是否存在于数组中,而不遍历它

Checking if element exists in array without iterating through it

本文关键字:遍历 数组 是否 元素 存在 于数组 检查      更新时间:2023-09-26

我的数组:

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

为了检查元素是否存在,我会这样做:

for (var i in tempListArray) {
    //check flag
    if (tempListArray[i].id == Id) {
        flagExistsLoop = 1;
        break;
    }
} 

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

感谢

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

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

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

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

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

我会使用其中一个:

  • 带数字索引的for循环:

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

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

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

  • for...of循环(EcmaScript 6):

    for (var item of tempListArray) {
        if (item.id == Id) {
            flagExistsLoop = 1;
            break;
        }
    } 
    

根据您的场景,您可以使用Array.indexOf(),如果项目不存在,它将返回-1。

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

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/>");
}

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

没有办法不遍历元素(这将是神奇的)。

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

在有限的情况下有一个可能的欺骗:),它很神奇。。。咳嗽咳嗽(数学)

假设你有三个元素:

  • 1
  • 2
  • 3

你想知道其中一个是否在一个数组中,而不需要迭代…

我们可以制作一个包含数组的数字风格的数字。我们通过给元素分配素数来做到这一点:

  • 1-2
  • 2-3
  • 3-5

数组,因此当我们添加项2时,我们通过检查(如果Flavor!=0&&(Flavor%3)=0),然后加入主要香料*=3;

现在我们可以通过查看数字来判断第二个元素在数组中。

if Flavor=0&amp;(风味%3)==0//它在那里!

当然,这仅限于计算机可以处理的数字表示。并且对于小的阵列尺寸(1-3个元件),扫描可能仍然更快。但这只是一个想法。

但其基础相当健全。但是,如果不能将元素与一组素数一一关联,则此方法将变得不可用。你需要提前计算素数。并验证了它们的乘积是较少数值的最大数值表示。(浮点也要小心。因为由于可表示值之间的间隙,它们可能无法表示较高值的数字。)使用无符号整数类型可能运气最好。

这种方法可能限制性太强。如果你不想迭代整个数组,你还可以做一些其他的事情来加速你的系统。

使用不同的结构:字典/地图/树等

如果你附加到数组,另一个方法可以是bloom过滤器。这会让你知道一个元素是否不在你的集合中,这同样有用。