Я построил это расширение Chrome для нашего внутреннего портала.На этом портале есть форма, в которой вводится только одна текстовая область.Пользователи обычно публикуют набор строк в этой форме.Таким образом, мое расширение сохраняет эти значения при локальной отправке и отображает историю команд, которые пользователь отправил в форме в обратном хронологическом порядке.
В настоящее время я сохраняю каждую команду как значение, а текущую метку времени - как ключ вLocalStorage.Если пользователь публикует одни и те же данные дважды, они сохраняются в виде двух разных пар ключ-значениеПри каждой загрузке страницы я получаю все ключи из localStorage в массиве, сортирую массив в обратном хронологическом порядке.Затем повторите итерацию по массиву, чтобы создать еще один массив с объектами пары ключ-значение.Затем я отображаю их в узлах DOM как историю команд ввода.
Теперь это очень неэффективный метод, лучше было бы хранить все пары ключ-значение в одной JSON.stringify
редактируемой строке.И всякий раз, когда пользователь публикует один и тот же ввод дважды, предыдущее значение метки времени должно быть перезаписано для той же команды.Короче говоря, одна и та же команда не должна храниться дважды.
Есть два способа сделать это.ЭТО ГДЕ НУЖНА ПОМОЩЬ.
1-й метод : Создайте один объект с ключами в качестве команды и значениями в качестве текущей метки времени.Скажем:
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}]
2-й метод : я сохраняю команды в массиве объектов, содержащих только одно свойство, и просто использую 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}
]
Теперь мне не нужно сортировать их каждый раз, когда я хочу отобразить или, другими словами, при каждой загрузке страницы(что происходит очень часто, так как отправка формы перенаправляется на ту же страницу).Но если перед сохранением каждой команды мне нужно будет сначала пройтись по массиву, чтобы проверить, существует ли уже та же команда, и перезаписать, если она есть, и это произойдет при отправке формы, то есть до тех пор, пока этот вопрос не будет отсортирован out, форма не будет отправлена.
Теперь какой путь будет более эффективным.
Заранее спасибо.