[英]Effective ways of finding an element in a Javascript array
我正在使用带标题的数组。 每个标题索引对应于数据库中的id,该id包含该给定标题的html。
假设我有一个包含其中一个标题的字符串。
title = "why-birds-fly";
titles[] // an array which contains all the titles
要使用字符串“title”来获取相应的ID,我可以这样做:
for (i = 0; i < titles.length-1; i++) {
if (titles[i] == title)
return i+1;
}
我可以使用的另一种方法是创建一个关联数组和titles数组,这与titles完全相反。 也就是说,它使用字符串作为索引并返回数字。
titles_id {blah:0,why-birds-fly:1,blah2:2}
然后我可以通过以下方式访问ID:
return titles_id[title]+1;
考虑到CPU,内存等,最有效的是什么?
另外,如果我的逻辑完全错误,请告诉我。
谢谢威廉
考虑您需要存储的键值对的数量也很重要。 如果它小于~50(取决于实现)那么进行线性搜索将与执行哈希表查找一样有效,因为计算哈希值和解决冲突的成本。 一个例外是Google chrome v8 JavaScript引擎保留了所有对象的缓存版本,允许它直接查找对象上的属性,因此使用Object类作为哈希表可能会更快,尽管我我不确定创建此缓存版本的成本是否会超过较小列表的好处。
您可以在第一个方法中使用Array的indexOf函数。
以下是Mozilla开发人员提供的信息: https : //developer.mozilla.org/En/Core_JavaScript_1.5_Reference : Objects : Array : indexOf
indexOf是ECMA-262标准的JavaScript扩展; 因此,它可能不存在于标准的其他实现中。 您可以通过在脚本的开头插入以下代码来解决此问题,允许在ECMA-262实现中使用indexOf,这些实现本身不支持它。 该算法与Firefox和SpiderMonkey中使用的算法完全相同。
if (!Array.prototype.indexOf)
{
Array.prototype.indexOf = function(elt /*, from*/)
{
var len = this.length >>> 0;
var from = Number(arguments[1]) || 0;
from = (from < 0)
? Math.ceil(from)
: Math.floor(from);
if (from < 0)
from += len;
for (; from < len; from++)
{
if (from in this &&
this[from] === elt)
return from;
}
return -1;
};
}
Javascript数组可以使用诸如标题“why-birds-fly”之类的值作为索引。
例如:var title =“why-birds-fly”;
var TitleArray [] = new Array();
TitleArray [title] = id;
然后你可以通过标题直接访问id:
return TitleArray [title];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.