Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中使用哈希存储大型列表的最佳方法_Javascript_List_Object - Fatal编程技术网

在Javascript中使用哈希存储大型列表的最佳方法

在Javascript中使用哈希存储大型列表的最佳方法,javascript,list,object,Javascript,List,Object,我有一个有10000个入口的列表 例如 myList = {}; myList[hashjh5j4h5j4h5j4] myList[hashs54s5d4s5d4sd] myList[hash5as465d45ad4d] .... 我不使用数组(0,1,2,3),因为我可以检查 如果此哈希存在或不存在,则速度非常快 if(typeof myObject[hashjh5j4h5j4h5j4] == 'undefined') { alert('it is new'); } else {

我有一个有10000个入口的列表

例如

myList = {};
myList[hashjh5j4h5j4h5j4]
myList[hashs54s5d4s5d4sd]
myList[hash5as465d45ad4d]
....
我不使用数组(0,1,2,3),因为我可以检查 如果此哈希存在或不存在,则速度非常快

if(typeof myObject[hashjh5j4h5j4h5j4] == 'undefined')
{
  alert('it is new'); 
}
else
{
  alert('old stuff'); 
}
但我不确定,这是一个好的解决方案吗
处理一个包含10000个条目的对象可能有问题吗?

编辑:

我尝试构建一个rss提要阅读器,它只显示新的提要。因此,我从链接(每个新闻都有一个uniqe链接)计算一个散列,并将其存储在对象(mongoDB)中。顺便说一句:10.000入口不是正常情况(但这是可能的)

您可以使用
中的
操作符:

if ('hashjh5j4h5j4h5j4' in myList) { .. }
但是,对于对象原型链中的成员,这也将返回
true

Object.prototype.foo = function () {};
if ("foo" in myList) { /* will be true */ };
要解决此问题,您可以改为使用:


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

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

我的建议:

  • 对手头的任务使用尽可能小的哈希值。如果您处理的是数百个可哈希字符串,而不是数十亿个,那么您的哈希长度可能相对较小
  • 将散列存储为整数,而不是字符串,以避免占用的空间小于需要的空间
  • 不要存储为对象,只需将它们存储在一个简单的二叉树log2(keySize)深处
  • 进一步思考:

  • 你能用混合的方法来解决这个问题吗?对不到一个月的最新提要使用哈希,并且不要麻烦显示超过一个月的条目。将哈希和日期存储在一起,并每天清理旧哈希

  • 这在现代计算机的现代浏览器中无论如何都不是问题

    每个占用50字节的10k条目仍将占用不到500KB的ram

    只要js是gzip服务的,那么带宽就没有问题——但是一定要尽可能晚地提供数据,这样它们就不会阻塞感知的页面负载性能


    总而言之,除非你想迎合手机的需求,否则你的解决方案很好。

    +1。这里的问题不是将10000个对象存储在一个对象中,问题是包含10000个对象的页面的大小,以及传输它们所花费的时间。可能哈希代码将在客户端生成,而不需要传输。请告诉我们您正试图实现的目标,因为它会影响你得到的建议。但是如果有更好的方法来提高效率,那也不会有什么坏处。没错,解决方案当然可以优化很多。然而,这种方法本身是很好的,现代浏览器处理对象上的10k属性也没有问题。我无法在MongoDb中保存“二叉树日志”,但您的进一步想法很有趣。我必须(独自一人)平静地思考这件事。
    if (myList.hasOwnProperty('hashjh5j4h5j4h5j4')) { .. }