【问题标题】:Remove array element when subarray has certain values当子数组具有特定值时删除数组元素
【发布时间】:2013-07-12 22:15:26
【问题描述】:

我有一个数组,其中包含任意数量的subarrays,每个都包含两个值。

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

以下部分不起作用,只需删除第一个subarray

var index = interestArray.indexOf([manuId, typeId]);
interestArray.splice(index, 1);

【问题讨论】:

  • 比较不是过滤/删除元素。
  • 否,但您的主要问题是确定要删除的项目。一旦找到它,删除它就变得微不足道了。

标签: javascript jquery arrays multidimensional-array


【解决方案1】:

对于一般的做法,你可以filter数组:

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

您不能使用indexOf,因为它会查找相同的对象(而不仅仅是等效对象)。

如果您运行的是没有 Array.filter 的早期版本的 JS,那么上面链接的 filter 文档页面上有一个很好的 shim。

【讨论】:

    【解决方案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;,否则会向后循环,以防可能出现多个匹配项
    • 这将跳过第二个连续匹配。 (因此,如果您以var arr = [[1,2],[3,4],[3,4],[5,6]]; 开头,则最后的输出将是[[1,2],[3,4],[5,6]](第二个[3,4] 仍在列表中)。
    【解决方案3】:

    这是我个人的更完整的解决方案,以避免多次进入问题和中断;上面看到的东西,如果数组是在删除条目之后出现的,它也可以避免问题(它是基于 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 }); 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-19
      • 2019-06-03
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      相关资源
      最近更新 更多