上下文:我有一个网络工作者认为"订阅"经由网页套接字从后端数据更新,然后将其发布到经由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级别的重复数据删除,而不是内容级别...总是只是盲目地使用最新数据.
所以有几个问题:
有没有更好的方法呢?我会喜欢看到一个核心选项,但我没有遇到过.这似乎是相对常见的功能.我在这里疯了,重新发明轮子?(换句话说,初始化选项?)
在条件检查中是否存在匹配,您会看到这一行:var matchedRow = $(this.rows().nodes()[matchedIndex]);这让我觉得很古怪,但我无法理解其他方法来识别.remove()链中使用的行.在我看来,我已经知道了行的索引,所以我认为类似的东西matchedRow = this.rows(matchedIndex)会工作,但我找不到那个或类似的东西.因此,我不仅要深入研究,rows().nodes()而且整个事情都被包装在jQuery中,然后被传递到.row(matchedRow)'.它似乎是如此重叠嵌套和包装的东西,我觉得我应该已经可以直接访问.
别误会我的意思; 代码"工作"并修复它可能是微优化.但它让我觉得非常复杂,给了我一些代码味道,我想为维护开发人员避免这种情况.
正如您所说,这可能是一个微观优化,但一个选项可能是选择所有行并将它们全部删除。
$.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)
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |