检查元素是否存在于数组中,而不遍历它
Checking if element exists in array without iterating through it
我的数组:
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.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; } }
根据您的场景,您可以使用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&;(风味%3)==0//它在那里!
当然,这仅限于计算机可以处理的数字表示。并且对于小的阵列尺寸(1-3个元件),扫描可能仍然更快。但这只是一个想法。
但其基础相当健全。但是,如果不能将元素与一组素数一一关联,则此方法将变得不可用。你需要提前计算素数。并验证了它们的乘积是较少数值的最大数值表示。(浮点也要小心。因为由于可表示值之间的间隙,它们可能无法表示较高值的数字。)使用无符号整数类型可能运气最好。
这种方法可能限制性太强。如果你不想迭代整个数组,你还可以做一些其他的事情来加速你的系统。
使用不同的结构:字典/地图/树等
如果你附加到数组,另一个方法可以是bloom过滤器。这会让你知道一个元素是否不在你的集合中,这同样有用。
- 循环遍历以数组为值的Javascript对象
- 如何遍历包含对象的数组-javascript
- JS.循环遍历多维数组,以计数元素在每列中的出现次数
- 根据PHP中数组的长度在Google Maps API中循环遍历标记
- 无法在javascript中循环遍历对象数组
- 如何使用jquery遍历具有动态添加元素的数组
- 我想遍历一个对象数组,我不想要任何重复项
- 一次循环遍历一组
- 在 jquery 中循环遍历 2 个数组并组合
- 如何遍历一组值对 JSON 对象
- meteor 遍历一组会话以检查值是否已更改
- 循环遍历 2 个数组 JavaScript
- 循环遍历一组元素 jQuery
- Ember循环遍历一组复选框并获取选中的项目
- Javascript遍历一组属性
- 如何循环遍历一组jQuery元素—一次4个
- 循环遍历一组名称,每隔一段时间采取操作
- 使用D3js循环遍历一组图像
- 在javascript中遍历一组对象,并从该函数返回true
- 我如何遍历一组JS对象并为每个对象打印语句