Javascript 如何从表中删除不等于某个值的行?

Javascript 如何从表中删除不等于某个值的行?,javascript,jquery,Javascript,Jquery,我有一张像这样的桌子 R1C1 R1C2 R1C3 R2C1 R2C2 R2C3 R3C1 R3C2 R3C3 以及一个函数,该函数在找到特定单元格值时从表中删除一行。这很好,请参见下面的函数代码,结果是删除了第1行和第3行 但是,当我想做相反的事情时——通过将比较运算符从0更改为-1(如果找不到字符串,indexOf()将返回什么),只保留包含指定单元格值的行,该函数将删除所有行,而不是我所期望的行2 有谁能解释一下这一点,并为我提供一个如何实

我有一张像这样的桌子

R1C1     R1C2     R1C3
R2C1     R2C2     R2C3
R3C1     R3C2     R3C3
以及一个函数,该函数在找到特定单元格值时从表中删除一行。这很好,请参见下面的函数代码,结果是删除了第1行和第3行

但是,当我想做相反的事情时——通过将比较运算符从0更改为-1(如果找不到字符串,indexOf()将返回什么),只保留包含指定单元格值的行,该函数将删除所有行,而不是我所期望的行2

有谁能解释一下这一点,并为我提供一个如何实现我想要的解决方案吗

以下是功能代码:

function doFunction() {

let array = ['R3C2','R1C3'];

for (var i = 0; i < array.length; i++) {

    var removeRowWithCell = array[i];

    // change the comparison below to === -1 and it deletes all rows

    $('td').filter(function() {
        return $(this).text().indexOf(removeRowWithCell) === 0;
    }).closest('tr').remove();

   }
}
函数doFunction(){
让数组=['R3C2','R1C3'];
对于(var i=0;i
这是因为您首先查找
R3C2
并删除所有其他内容,下一次遍历循环时,您将搜索
R1C3
,但只有
R3C2
存在,并且将被删除。

您的===-1条件转换为“至少有一个单元格不等于“R3C2”或“R1C3”的行”

记住这一点(与数组“R3C2”分析中的第一项相比,每行只有第一个单元格):

  • 第一行单元格R1C1:“R1C1”。indexOf(“R3C2”)为-1=>选中单元格后,将删除该行

  • 第二行单元格R2C1:“R2C1”。indexOf(“R3C2”)为-1=>选中单元格后,将删除该行

  • 第三行单元格R3C1:“R2C1”。indexOf(“R3C2”)为-1=>选中单元格后,将删除该行

因此,您最终会删除所有行

保留包含数组中某些值的行的函数应如下所示:

function doFunction() {
    let array = ['R3C2','R1C3'];

    var rows = $('tr');

    for(var k = 0; k < rows.length; k++) {
        var currentRow = $(rows[k]);
        var columns = currentRow.find('td');
        var shouldKeepRow = false;  
        for (var i = 0; i < array.length; i++) {
            var removeRowWithCell = array[i];

            // Check if at least one column on this row contains this value
            shouldKeepRow = columns.filter(function() {
                return $(this).text().indexOf(removeRowWithCell) === 0;
            }).length > 0;

            if (shouldKeepRow) {
                break;
            }
        }

        if (!shouldKeepRow) {
            currentRow.remove();
        }
    }
}
函数doFunction(){
让数组=['R3C2','R1C3'];
变量行=$('tr');
对于(var k=0;k0;
如果(应该保持前进){
打破
}
}
如果(!shouldKeepRow){
currentRow.remove();
}
}
}

这是一个VanillaJS版本。也许这就是你想要的

let table=document.querySelector(“表”),
tBody=表.tBodies[0];
让数组=['R3C2','R1C3'];
数组.from(tBody.rows).forEach(函数(row){
让包含=假;
for(行中的let单元格。单元格){
if(array.indexOf(cell.innerText)!=-1){
包含=真;
打破
}
}
如果(!包含){
row.parentNode.removeChild(row);
}
});

R1C1
R1C2
R1C3
R2C1
R2C2
R2C3
R3C1
R3C2
R3C3

使用jQuery.inArray可以更轻松

function doFunction() {
    let array = ['R3C2','R1C3'];
    var rows = $('tr');

    for (var j = 0; j < rows.length; j++) {
        for (var i = 0; i < array.length; i++) {
            var cells = $(rows[j]).children('td').map(function() { return $(this).text(); });     

            if($.inArray(array[i], cells) === -1){
                $(rows[j]).remove();
            }
        }
    }
}
函数doFunction(){
让数组=['R3C2','R1C3'];
变量行=$('tr');
对于(var j=0;j
indexOf
从数组返回位置。如果它是
-1
,则表示不存在匹配项,但如果指定
0
,则应将其作为第一个元素。在您的情况下,我相信您需要
返回$(this).text().indexOf(RemoveOwWithCell)!=-1
要使用。查找与数组中任何元素匹配的所有行,然后删除它们。请参阅。我不确定我是否理解:我要做的是删除所有不匹配的元素?这听起来符合多个条件,但即使我将数组减少为仅1个元素,例如R1C3,它也会删除所有行,而不是第2行和第3行?