Вставка элементов в DOM, основание позиции на отметке времени - PullRequest
1 голос
/ 17 февраля 2012

У меня есть объект JSON с массивом «обновлений», где каждое «обновление» состоит из отметки времени и сообщения:

updates : {
    {
        timestamp : 1329505671,
        text : 'test1'
    },
    {
        timestamp : 1329505783,
        text : 'test2'
    }
}

Используя jQuery, я анализирую их в элементах DOM и вставляю их на том же уровне, в порядке их получения. Они предварительно отсортированы на основе моего SQL-запроса в вызове AJAX.

Теперь у меня есть повторяющийся вызов ajax, который проверяет наличие новых обновлений. Если обновление найдено, его нужно вставить в DOM, в соответствующую позицию.

Я не могу предположить, что эти обновления всегда будут самыми последними обновлениями в списке, поэтому мне нужен способ найти, какое DOM-обновление вставлять новое обновление после.

Я планировал создать Map<int, DOMUpdate> сортов (updates[timestamp] = DOMUpdate в Javascript).

В этом плане есть пара недостатков:

  1. Мне нужно было бы найти / создать быстрый алгоритм двоичного поиска для поиска какая временная метка ставить обновление после.
  2. У меня не могло быть дублированных меток времени.

Так что мой вопрос: сделал ли кто-то что-то подобное, и если да, то как вы к нему подошли? Пожалуйста, дайте мне знать, если я что-то неясно.

1 Ответ

2 голосов
/ 17 февраля 2012

Просто найдите первый элемент с временной меткой, превышающей его, и добавьте его перед этим элементом.Если ни один из них не найден, он является самым новым и должен быть добавлен в начале / конце в зависимости от того, в каком порядке вы их публикуете (сначала или последним).

var appended = false;
$(collection).each(function(){
  var timestamp = $(this).data("timestamp"); // replace with your code
  if (timestamp < obj.timestamp) {
    $(this).before(buildNewElement(obj));
    appended = true;
    return false;
  }
});
if (!appended) {
  $(collection).last().after(buildNewElement(obj));
}

Очевидно, это просто концепция, вывам нужно будет изменить его, чтобы он соответствовал вашему коду / требованиям.

Редактировать:

Если вы сохранили свои данные в массиве объектов, а затем добавили объекты в этот массив по мере получения большего количества данных, выможет отсортировать этот массив по временной метке, а затем добавить новые объекты на основе индекса после сортировки.Вам нужно будет добавить свойство к вновь полученным объектам, а затем удалить это свойство, когда вы перебираете все объекты и добавляете только те, которые имеют это свойство.

...