当子数组具有特定值时,删除数组元素

3
我有一个包含任意数量的子数组的数组,每个子数组都恰好包含两个值。
i.e: interestArray[[1, 5], [3, 8] ... ]

如何删除包含值 [3, 8] 的 subarray

我的代码:

$('td', container).click(function(){
      if(!$(this).hasClass('purchased') && !$(this).hasClass('manu'))
      {
        var manuId = $(this).parent().children('td:first-child').data('manu-id');
        var typeId = $(this).data('type-id');
        if($(this).hasClass('interest'))
        {
          $(this).removeClass('interest');
          $(this).parent().children('td.manu').removeClass('interest');
          var index = interestArray.indexOf([manuId, typeId]);
          interestArray.splice(index, 1);
        } else {
          $(this).addClass('interest');
          $(this).parent().children('td.manu').addClass('interest');

          interestArray.push([manuId, typeId]);
        }
      //updateSurvey(interestsArray);
      console.log(interestArray)
      }
    })

下面的部分无法正常工作,只会删除第一个子数组
var index = interestArray.indexOf([manuId, typeId]);
interestArray.splice(index, 1);

可能是在Javascript中比较两个数组的重复问题。 - RoToRa
比较并不等同于过滤/移除元素。 - imperium2335
不,但你的主要问题是识别出你想要移除的项目。一旦你找到它,移除它就变得微不足道了。 - RoToRa
3个回答

2

以下是符合您要求的一种通用方法:

var arr = [[1,2],[3,4],[5,6]];
var remove = [3,4];

for (var i=0; i<arr.length; i++) {
  if (arr[i][0] == remove[0] && arr[i][1] == remove[1]) {
    arr.splice(i, 1);
    break;
  }
}

console.log(arr); //=> [[1,2],[5,6]]

当您找到匹配项时,可能希望使用break;退出循环。否则,如果存在多个匹配项的可能性,则向后循环。 - Ian
这将跳过连续匹配的第二个。 (因此,如果您从var arr = [[1,2],[3,4],[3,4],[5,6]];开始,则最终输出将为[[1,2],[3,4],[5,6]](其中第二个[3,4]仍在列表中)。 - Ted Hopp

1

对于一般的方法,您可以筛选数组:

var reducedArray = interestArray.filter(function (item) {
    return item[0] != manuId || item[1] != typeId;
});

你不能使用 indexOf,因为它只查找相同的对象(而不是等价的对象)。

如果你运行的是早期版本的JS,没有 Array.filter,那么可以在上面链接到的 filter 文档页面上找到一个不错的模拟器。


0

这是我的个人解决方案,更完整地避免了多次输入问题和上面看到的break;问题,它还避免了在删除条目后数组出现问题(它基于jquery,但如果您感觉更舒适,可以使用常规循环):

    $.each( answers, function( index, value ){
        if (typeof answers[index] != "undefined") 
        {
            if(answers[index]["question_id"]==answer_to_del)
            {
                delete answers[index];
            }
        }

    });
    //Clean answer array from empty values created above
    answers = answers.filter(function(n){ return n != undefined }); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接