根据列值标记所选数据表行

时间:2016-06-02 22:13:05

标签: jquery datatables

我试图在Datatable中将几行标记为SELECTED,基于每行有2列值(该行有3列,但只有前2列是我需要比较的那些)。

目前的工作原理如下:

  1. 数据表中填充了多个城市(尚未标记为已选定)。这是来自其他来源的所有城市,用户可以选择或取消选择城市。但他们看到了整个城市。

  2. 然后,我发送一个带有用户ID的AJAX调用,以检索到目前为止选择的实际城市。

  3. 当我收到已经选择的城市时,我希望能够通过前2列(城市和州)搜索数据表。如果第1列和第2列与在步骤2中检索到的信息匹配,则将其标记为已选中(将该行标记为选定行)。

  4. 任何想法都表示赞赏。目前我一直在做的是:

    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;
                }
            }
        }); 
    }
    

    所以在这之后工作但是它需要太长时间,因为它必须为每个匹配的位置解析整个表。我试图避免整个表解析整个表格,只需执行以下操作:

    如果在数据表中找到了项目,请将其标记为可选择转到下一个。

2 个答案:

答案 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倍,而且更简单。问题是我在整个表格中搜索了每个州,城市选项。在这种情况下,我只针对每个州,城市找到了一对一的关系。