消除DataTables.net中的重复行

Gre*_*tit 8 datatables

上下文:我有一个网络工作者认为"订阅"经由网页套接字从后端数据更新,然后将其发布到经由DataTables.net渲染为了提高效率的图,相加的数据被向下推WebSocket的作为部分记录(即,仅一行).

由于数据与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;
});
Run Code Online (Sandbox Code Playgroud)

(不要嘲笑我在老式的"for"循环中获得安慰!)

然后在使用中,我这样做:

myTable.deDupe(dataSet).rows.add(dataSet).draw();
Run Code Online (Sandbox Code Playgroud)

接收的数据,然后该方法更新表已有的传入行,它包含在"数据集",然后我通过为这是指包含用于去欺骗目的的唯一ID的列中的列索引.请注意,在代码执行中,我不是删除传入的副本,而是删除上一行,然后添加传入的副本.在某些情况下,行包含更新的数据,我真的只关心ID级别的重复数据删除,而不是内容级别...总是只是盲目地使用最新数据.

所以有几个问题:

  1. 有没有更好的方法呢?我会喜欢看到一个核心选​​项,但我没有遇到过.这似乎是相对常见的功能.我在这里疯了,重新发明轮子?(换句话说,初始化选项?)

  2. 在条件检查中是否存在匹配,您会看到这一行:var matchedRow = $(this.rows().nodes()[matchedIndex]);这让我觉得很古怪,但我无法理解其他方法来识别.remove()链中使用的行.在我看来,我已经知道了行的索引,所以我认为类似的东西matchedRow = this.rows(matchedIndex)会工作,但我找不到那个或类似的东西.因此,我不仅要深入研究,rows().nodes()而且整个事情都被包装在jQuery中,然后被传递到.row(matchedRow)'.它似乎是如此重叠嵌套和包装的东西,我觉得我应该已经可以直接访问.

别误会我的意思; 代码"工作"并修复它可能是微优化.但它让我觉得非常复杂,给了我一些代码味道,我想为维护开发人员避免这种情况.

For*_*ty3 1

正如您所说,这可能是一个微观优化,但一个选项可能是选择所有行并将它们全部删除。

$.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;
});
Run Code Online (Sandbox Code Playgroud)

参见行选择器:函数参考