Устранение повторяющихся строк в DataTables.net - PullRequest
0 голосов
/ 18 декабря 2018

Контекст: у меня есть веб-работник, который «подписывается» на обновления данных из серверной части через веб-сокет, которые затем публикуются в представлении, отображаемом через DataTables.net. Для повышения эффективности добавленные данные помещаются в веб-сокет какчастичная запись (т. е. только одна строка).

Поскольку данные отделены от DataTable (т. е. он не использует Ajax API; это в основном источник JavaScript), я не могу просто добавить строку и отобразитьТаблица.В случае срабатывания двух нажатий на одну и ту же строку я получаю дублирующиеся строки.

Итак, я выбрал небольшой плагин:

$.fn.dataTable.Api.register('deDupe', function (dataSet, idColumn) {
  idColumn = idColumn || 0;
  var columnData = this.columns().data()[idColumn];

  for(var i=0; i < dataSet.length; i++) {
    var thisId = dataSet[i].id;
    var matchedIndex = columnData.indexOf(thisId);
    if(matchedIndex > -1) {
      var matchedRow = $(this.rows().nodes()[matchedIndex]);
      this.row(matchedRow).remove();
    }
  }

  // return "this" for chaining
  return this;
});

(Не смейтесь надменя за то, что я утешался старомодными циклами "for"!)

И затем при использовании я делаю это:

myTable.deDupe(dataSet).rows.add(dataSet).draw();

Метод, который получает данные и затем обновляет таблицу, уже имеетвходящая строка, которая содержится в «dataSet», а затем я передаю индекс COLUMN для столбца, который должен содержать уникальный идентификатор в целях устранения дублирования.Обратите внимание, что при выполнении кода вместо удаления входящего дубликата я удаляю предыдущую строку, а затем добавляю входящий.Бывают случаи, когда строка содержит обновленные данные, и я действительно беспокоюсь только об устранении дублирования на уровне идентификатора, а не на уровне содержимого ... всегда просто слепо использую последние данные.

Итак, несколько вопросов:

  1. Есть ли лучший способ сделать это?Мне бы очень хотелось увидеть основной вариант, но я его не встречал.Кажется, это довольно распространенный функционал.Я сумасшедший здесь, заново изобретая колесо?(другими словами, опция инициализации?)

  2. При условной проверке совпадения вы видите эту строку: var matchedRow = $(this.rows().nodes()[matchedIndex]); Это кажется мне дурацким, но я не смогобдумайте другие способы определения строки, которая будет использоваться в цепочке .remove().По моему мнению, я уже знаю индекс строки, поэтому я думал, что что-то вроде matchedRow = this.rows(matchedIndex) будет работать, но я не могу найти это или что-то подобное.Так что я не только копаюсь в rows().nodes(), но затем все это оборачивается в jQuery, а затем передается в .row(matchedRow) '.Кажется, он так сильно вложен и обернут для чего-то, что я чувствую, что уже должен иметь прямой доступ.

Не поймите меня неправильно;код «работает» и исправление его, вероятно, является микрооптимизацией.Но это кажется мне чрезвычайно запутанным и дает мне некоторый запах кода, которого я хочу избежать ради разработчиков технического обслуживания.

1 Ответ

0 голосов
/ 28 декабря 2018

Как вы сказали, это может быть микрооптимизация, но можно выбрать все строки и удалить их en toto.

$.fn.dataTable.Api.register('deDupe', function (dataSet, idColumn) {

  idColumn = idColumn || 0;

  // Get the possible dataSet ids into an array for easier lookup
  var dsIds = dataSet.map( (d) => d.id );

  // Use a function in the rows() API to obtain all rows with
  // a value in the idColumn that matches one of the incoming
  // ids on the dataSet
  var matchedRows = this.rows( (i,r) => dsIds.indexOf(r[idColumn]) > -1 );

  // Remove all of the rows at once (this could be chained to the selector above)
  matchedRows.remove();

  // return "this" for chaining
  return this;
});

См. Выбор строки: Функцияссылка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...