我的阵列:
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个元素。
由于
答案 0 :(得分:2)
不,没有使用自定义词典对象(你真的不想这样做),没有比进行全面扫描更快的方法了。所有包含的对象。
作为一般的经验法则,不要担心任何语言或任何情况下的性能,直到迭代总数达到5位数,最常见的是6或7.扫描100个元素的表应该是几个最糟糕的是毫秒。在注意到效果影响之前担心性能影响是worst kinds of premature optimization之一。
答案 1 :(得分:2)
不,如果不重复数组,你就无法知道。
但是,注意for...in
循环是迭代数组的坏方法:
Array.prototype
和Object.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个元素:
,您想知道其中之一是否在数组中而不对其进行迭代...
我们可以创建一个包含数组数字风格的数字。我们通过为元素分配素数来实现:
该数组,因此当我们添加项目2时,我们通过检查(如果Flavor!= 0 &&(Flavor%3)!= 0)来检查该数组是否不包含与该项目关联的质数,然后添加质数* = 3;
现在我们可以通过看数字来判断第二个元素在数组中。
如果Flavor!= 0 &&(Flavor%3)== 0 //它在那里!
当然,这仅限于计算机可以处理的数字表示形式。对于较小的阵列大小(1-3个元素),扫描速度可能仍然更快。但这只是一个主意。
但是基础很不错。但是,如果无法将元素与一组素数相互关联,则此方法将无法使用。您需要预先计算素数。并验证这些乘积是否小于最大数值表示形式。 (也要注意浮点数。由于可表示的值之间存在间隙,它们可能无法以较高的值表示数字。)运气最好的是无符号整数类型。
此方法可能太局限了。如果您不想迭代整个阵列,则可以采取其他措施来加快系统速度。
使用不同的结构: 字典/地图/树等。
如果您附加到数组,则另一个方法可以是Bloom过滤器。这将让您知道元素中是否没有元素,这可能同样有用。