如何在JavaScript中使用filter()从数组中删除元素?

时间:2017-07-05 05:25:02

标签: javascript arrays

我需要从数组中删除所有元素,并且要删除的所有元素都作为参数传递。 我试图使用筛选方法删除它们但它无法正常工作。 代码是:

function destroyer(arr) {
  // Remove all the values
  var args = Array.from(arguments);
  args.shift();
  console.log(args);
   var arr1 = arr.filter(function(v){
    for(var i= 0;i < args.length;i++){
        if(arr.indexOf(args[i]) !== -1)
            return false;
        
    }
  });
    console.log(arr1);
  return arr;
}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);

我使用args数组将所有参数存储到数组中。第一个参数是要从中删除元素的数组,以下参数是要删除的参数(确定它们存在于数组中) )但不知何故过滤功能不能正常工作,更多信息请参阅, FreeCodeCamp challenge

3 个答案:

答案 0 :(得分:0)

您需要返回arr1而不是arr

filter()方法创建一个新数组而不是修改源数组,因此您需要从方法中返回新创建的数组。

至于你的过滤逻辑,我认为它应该是这样的:

function destroyer(arr) {
  let args = Array.from(arguments);
  args.shift();

  return arr.filter(v => args.indexOf(v) === -1);
}

console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));

或者,如果您只定位已支持rest parameters的浏览器:

function destroyer(arr, ...args) {
  return arr.filter(v => args.indexOf(v) === -1);
}

console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));

答案 1 :(得分:0)

您需要更改过滤器功能,检查arr中的每个值是否在args,如果是return false则为return true

&#13;
&#13;
function destroyer(arr) {
  // Remove all the values
  var args = Array.from(arguments);
  args.shift();
  console.log(args);
   var arr1 = arr.filter(function(v){
      return (args.indexOf(v) !== -1) ? false : true;        
  });
    console.log(arr1);
  return arr;
}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

只是为了记录,你的代码的问题是你每次循环遍历 args 的所有元素,所以如果 arr 的任何元素你返回false匹配 args 的任何元素(忽略传递给回调的实际值)。

修复你的代码,摆脱那个循环并针对 args 测试 v

function destroyer(arr) {
  // Remove all the values
  var args = Array.from(arguments);
  args.shift();
  console.log(args);
  var arr1 = arr.filter(function(v) {
//    for (var i=0; i < args.length; i++) {
      if (args.indexOf(v) !== -1) {
        return false;
      }
      return true;
//    }
  });
  console.log(arr1);
  return arr1;    // return correct array
}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);

完成后,很容易看到如何将其减少(使用休息参数和箭头功能):

function destroyer(arr, ...args) {
  return arr.filter(v => !args.includes(v));
}

console.log( destroyer([1, 2, 3, 1, 2, 3], 2, 3) );