【发布时间】:2012-04-02 05:43:40
【问题描述】:
我已经为我们的内部门户构建了这个 chrome 扩展。此门户中有一个表单,只有一个文本区域作为输入。用户通常以该形式发布一组字符串。所以我的扩展程序将这些值存储在本地提交,并按时间倒序显示用户在表单中发布的命令的历史记录。
我目前所做的是将每个命令作为值和当前时间戳作为键存储到 localStorage。如果用户两次发布相同的数据,则两者都存储为 2 个不同的键值对。在页面的每次加载中,我从 localStorage 中检索数组中的所有键,并按时间倒序对数组进行排序。然后再次遍历数组以创建另一个包含键值对对象的数组。然后我将它们显示在 DOM 节点中作为输入命令的历史记录。
现在这是一种非常低效的方法,更好的方法是将所有键值对存储在单个JSON.stringifyed 字符串中。并且每当用户两次发布相同的输入时,都应该为同一命令覆盖先前的时间戳值。简而言之,相同的命令不应该被存储两次。
有两种方法可以做到这一点。这就是我需要帮助的地方。
第一种方法:创建一个对象,将键作为命令,将值作为当前时间戳。说:
var command = $('textarea').val();
var storageTank = JSON.parse(localStorage["MyTank"]);
storageTank[command] = new Date().getTime();
localStorage["MyTank"] = JSON.stringify(storageTank);
所以我的 storageTank 看起来像
{
"run": 1331916048253,
"stop": 1331916049963,
"modify":1331916086324,
"delete": 1331916099874
//and so on... Remember there can be as much as 1000 to 1500 of such commands,
//some of them very large
}
现在我的数据存储为无序字典。每当(主要是onload)我需要以(反向)时间顺序显示它们时,我必须创建一个对象数组,每个对象都包含一个键(命令)和查询(时间戳)并对其进行排序。
赞这个[{"run": 1331916048253},{"stop": 1331916049963},{"modify":1331916086324},{"delete": 1331916099874}]
第二种方法:我将命令存储在一个只包含一个属性的对象数组中,并简单地使用push、pop 和reverse维护年表。喜欢
var command = $('textarea').val();
var entity = {};
entity[command] = new Date().getTime();
var storageTank = JSON.parse(localStorage["MyTank"]);
storageTank.push(entity);
localStorage["MyTank"] = JSON.stringify(storageTank);
现在我的储罐是这样的
[
{"run": 1331916048253},
{"stop": 1331916049963},
{"modify":1331916086324},
{"delete": 1331916099874}
]
现在我不需要在每次我想显示时或换句话说,在每个页面加载时都对它们进行排序(由于表单提交在同一页面上重定向,这种情况经常发生)。但是,如果在保存每个命令之前,我需要先遍历数组以检查天气是否已经存在相同的命令,如果存在则覆盖,这将在表单提交时发生,这意味着直到这件事排序 em> out,表单将不会提交。
现在哪种方式效率更高。
提前致谢。
【问题讨论】:
标签: javascript arrays sorting iteration local-storage