我有一个包含大量值的数组,我正在迭代以找到这样的特定值:
function haveValue(value) {
for(var index in arr) {
var prop = arr[index];
if(prop === value) {
return true;
}
}
return false;
}
但是我发现我可以通过使用对象更快地执行此查找:
function haveValue(value) {
return typeof obj[value] !== 'undefined';
}
但是,在这样做之后,我没有看到很多性能方面的改进。所以我想知道,对象属性如何存储在Javascript / Node.js中?它们基本上是迭代的,以便找到,就像一个数组一样?我认为它们可能是使用哈希表或其他东西实现的。
答案 0 :(得分:0)
您已经询问过如何通过数组进行iliterating,如果使用对象会提供更好的性能,但是您使用for in
循环来表示数组,并且使用{{1}可以更好地增加性能loop或es6包含方法。
如果for
是一个数组而您只想检查它是否包含值,则可以使用es6 arr
方法(docs here)
includes()
N.B。你需要检查你的目标浏览器是否支持它,如果没有,则需要shim / pollyfill。
如果您不想使用es6,那么您可以循环使用function haveValue(value) {
return (arr.includes(value));
}
循环
for
在您的示例中,您使用的是function haveValue(value) {
for(var i = 0; i < arr.length; i++) {
if(arr[i] === value) {
return true;
}
}
return false;
}
循环,它实际上是对象而不是数组。 for in
循环在数组上使用时会给你更好的性能
虽然在使用字符串查找对象中的值(如hashmap)时对象的大小可能会影响perf,但效果可能无关紧要,因为js引擎将在内部进行优化。
检查这个jspef,选择一个对象的最后一个属性并不会真正影响性能。 (显然效果可能会扩大)