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

时间:2014-10-16 21:50:58

标签: javascript arrays performance

我的阵列:

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个元素。

由于

6 个答案:

答案 0 :(得分:2)

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

作为一般的经验法则,不要担心任何语言或任何情况下的性能,直到迭代总数达到5位数,最常见的是6或7.扫描100个元素的表应该是几个最糟糕的是毫秒。在注意到效果影响之前担心性能影响是worst kinds of premature optimization之一。

答案 1 :(得分:2)

不,如果不重复数组,你就无法知道。

但是,注意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;
        }
    } 
    

答案 2 :(得分:1)

根据您的情况,您可以使用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/>");
}

答案 3 :(得分:0)

尝试使用php.js它可能有帮助,虽然你可以使用相同的PHP函数名称,它有一些有用的功能

答案 4 :(得分:0)

没有迭代元素(这将是魔术)是没有办法的。

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

答案 5 :(得分:0)

在有限的情况下可能会作弊:)这很神奇...咳嗽咳嗽(数学)

假设您有3个元素:

  • 1
  • 2
  • 3

,您想知道其中之一是否在数组中而不对其进行迭代...

我们可以创建一个包含数组数字风格的数字。我们通过为元素分配素数来实现:

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

该数组,因此当我们添加项目2时,我们通过检查(如果Flavor!= 0 &&(Flavor%3)!= 0)来检查该数组是否不包含与该项目关联的质数,然后添加质数* = 3;

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

如果Flavor!= 0 &&(Flavor%3)== 0 //它在那里!

当然,这仅限于计算机可以处理的数字表示形式。对于较小的阵列大小(1-3个元素),扫描速度可能仍然更快。但这只是一个主意。

但是基础很不错。但是,如果无法将元素与一组素数相互关联,则此方法将无法使用。您需要预先计算素数。并验证这些乘积是否小于最大数值表示形式。 (也要注意浮点数。由于可表示的值之间存在间隙,它们可能无法以较高的值表示数字。)运气最好的是无符号整数类型。

此方法可能太局限了。如果您不想迭代整个阵列,则可以采取其他措施来加快系统速度。

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

如果您附加到数组,则另一个方法可以是Bloom过滤器。这将让您知道元素中是否没有元素,这可能同样有用。