我试图在Datatable中将几行标记为SELECTED,基于每行有2列值(该行有3列,但只有前2列是我需要比较的那些)。
目前的工作原理如下:
数据表中填充了多个城市(尚未标记为已选定)。这是来自其他来源的所有城市,用户可以选择或取消选择城市。但他们看到了整个城市。
然后,我发送一个带有用户ID的AJAX调用,以检索到目前为止选择的实际城市。
当我收到已经选择的城市时,我希望能够通过前2列(城市和州)搜索数据表。如果第1列和第2列与在步骤2中检索到的信息匹配,则将其标记为已选中(将该行标记为选定行)。
任何想法都表示赞赏。目前我一直在做的是:
function(data){
var maxOptions = serviceAreas.columns(0).data().eq(0).length;
data.forEach(function(item) {
for (var totalOptions = 0; totalOptions < maxOptions; totalOptions++) {
checkedOption = serviceAreas.row(totalOptions).data()[0] + ',' + serviceAreas.row(totalOptions).data()[1];
if (item == checkedOption) {
serviceAreas.row(totalOptions).select();
break;
}
}
});
}
所以在这之后工作但是它需要太长时间,因为它必须为每个匹配的位置解析整个表。我试图避免整个表解析整个表格,只需执行以下操作:
如果在数据表中找到了项目,请将其标记为可选择转到下一个。
答案 0 :(得分:1)
您可以在选项上创建“键盘映射”。通过它,您可以完全跳过(慢)外forEach
循环。此外,您只需要每行调用一次昂贵的table().row().data()
链。
var maxOptions = serviceAreas.columns(0).data().eq(0).length,
checkedOption, rowData,
options = [];
//create a lookup table
for (var i = 0; i<data.length; i++) {
options[data[i]] = true
}
for (var totalOptions = 0; totalOptions < maxOptions; totalOptions++) {
//only read data once per row
rowData = serviceAreas.row(totalOptions).data()
checkedOption = rowData[0] + ',' + rowData[1];
//select() if checkedOption exists as key in options
if (options[checkedOption]) serviceAreas.row(totalOptions).select();
}
当然,完全未经测试,无法轻松复制您的场景,但这肯定会更快地运行。
答案 1 :(得分:1)
根据大卫的想法(谢谢大卫),代码从前一个转到:
function(data){
var maxOptions = serviceAreas.columns(0).data().eq(0).length;
for (var totalOptions = 0; totalOptions < maxOptions; totalOptions++) {
rowData = serviceAreas.row(totalOptions).data()
checkedOption = rowData[0] + ',' + rowData[1];
if (data.indexOf(checkedOption) > 0) {
serviceAreas.row(totalOptions).select();
}
}
}
它不仅比以前快了大约10倍,而且更简单。问题是我在整个表格中搜索了每个州,城市选项。在这种情况下,我只针对每个州,城市找到了一对一的关系。