在Javascript中存储带有哈希值的大型列表的最佳方法

时间:2011-09-23 07:45:41

标签: javascript list object

我有一个包含10.000个推文的列表。

例如

myList = {};
myList[hashjh5j4h5j4h5j4]
myList[hashs54s5d4s5d4sd]
myList[hash5as465d45ad4d]
....

我不使用数组(0,1,2,3),因为我可以检查 很快
- >如果这个哈希存在与否。

if(typeof myObject[hashjh5j4h5j4h5j4] == 'undefined')
{
  alert('it is new'); 
}
else
{
  alert('old stuff'); 
}

但我不确定,这是一个很好的解决方案吗?
处理具有10.000个条目的对象可能是个问题吗?

修改
我尝试构建一个rss提要阅读器,它只显示新的提要。所以我从链接计算一个哈希值(每个新闻都有一个uniqe链接)并将其存储在对象(mongoDB)中。 BTW:10.000次托管不是正常情况(但有可能)

4 个答案:

答案 0 :(得分:3)

您可以使用in运算符:

if ('hashjh5j4h5j4h5j4' in myList) { .. }

但是,这也会为对象原型链中的成员返回true

Object.prototype.foo = function () {};
if ("foo" in myList) { /* will be true */ };

要解决此问题,您可以改为使用hasOwnProperty

if (myList.hasOwnProperty('hashjh5j4h5j4h5j4')) { .. }

虽然您自己可能没有为Object.prototype添加方法,但您无法保证您使用的其他第三方库没有;顺便说一句,延伸Object.prototype是不受欢迎的,所以你不应该这样做。的为什么?;因为你不应该修改你不拥有的东西。

答案 1 :(得分:3)

我的建议:

  1. 尽可能少地使用哈希来完成手头的任务。如果您处理数百个可哈希的字符串,与数十亿相比,那么您的哈希长度可能相对较小。
  2. 将散列存储为整数,而不是字符串,以避免占用较少的空间。
  3. 不要存储为对象,只需将它们存储在一个简单的二叉树log2(keySize)中。
  4. 进一步的想法:

    1. 你能用混合方法来解决这个问题吗?使用最近不到一个月的饲料的哈希值,并且不要打扰显示超过一个月的项目。将哈希和日期存储在一起,并每天清理旧的哈希值?

答案 2 :(得分:2)

10.000非常多。您可以考虑将哈希值存储在数据库中并使用ajax进行查询。查询一个哈希可能需要更长的时间,但页面加载速度要快得多。

答案 3 :(得分:0)

现代计算机上的现代浏览器无论如何都不是问题。

每个占用50个字节的10k条目仍然会占用不到500KB的RAM。

只要js被gzip压缩,那么带宽就没问题 - 但是尽量尽量提供数据,这样它们就不会阻止感知的页面加载性能。

总而言之,除非您希望迎合手机,否则您的解决方案就可以了。