删除特定参数

时间:2016-02-14 07:41:47

标签: javascript filter arguments default-arguments

我试图根据传递变量删除一些单词。

但是,我写了两个版本的代码,这些代码有些不同!

他们产生了不同类型的输出,我不明白为什么!

所以我需要你们的帮助,非常感谢你们!

  

此功能将接受不同数量的变量,

     

可能是([arr],1,2)或([arr],1,2,8,9 ......)等,

     

并根据传递的数字删除第一个数组中的变量。

     

例如:驱逐舰([1,2,3,4],2,3) - >输出应为[1,4]

     

这是我的代码。 (注意粗体字的细微差别!)

function destroyer(arr) {
    for ( var i = 1; i < arguments.length; i++ ){
        arr = arguments[0].filter(function(value){
        if( value == arguments[i]){
          return false;
        }else{
          return true;
        }
      }); 
    }
  return arr;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
  

输出将是[1,2,3,1,2,3],这意味着 value == arguments [i] 不起作用。然而,

function destroyer(arr) {
    for ( var i = 1; i < arguments.length; i++ ){
        filter = arguments[i];
        arr = arguments[0].filter(function(value){
        if( value == filter){
          return false;
        }else{
          return true;
        }
      }); 
    }
  return arr;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
  

这个版本完美地显示了我[1,1]。

     

那么第一个版本出了什么问题???谢谢!!

2 个答案:

答案 0 :(得分:2)

第一个问题是arguments适用于.filter()回调函数(最近的函数作用域,而不是父函数作用域),因此arguments[i]不是你想要的成为。

您可以将这些参数复制到一个实际的数组中,然后您可以从.filter()回调中引用它。

function destroyer(arr) {
    var args = [].slice.call(arguments, 1);
    for ( var i = 0; i < args.length; i++ ){
        arr = arr.filter(function(value){
        if( value == args[i]){
          return false;
        }else{
          return true;
        }
      }); 
    }
  return arr;
}
var a = destroyer([1, 2, 3, 1, 2, 3], 2, 3);

// show output
document.write(JSON.stringify(a));

就个人而言,我建议使用更简单的版本:

function destroyer(arr) {
    var args = [].slice.call(arguments, 1);
    return arr.filter(function(value) {
        return args.indexOf(value) === -1;
    });
}
var a = destroyer([1, 2, 3, 1, 2, 3], 2, 3);

// show output
document.write(JSON.stringify(a));

使用扩展运算符可以在ES6中更简单地编写:

function destroyer(arr, ...args) {
    return arr.filter(function(value) {
        return args.indexOf(value) === -1;
    });
}
var a = destroyer([1, 2, 3, 1, 2, 3], 2, 3);

// show output
document.write(JSON.stringify(a));

或者,如果您更喜欢更短的ES6表示法并希望使用新的Array.prototype.includes()

function destroyer(arr, ...args) {
    return arr.filter(value => !args.includes(value));
}
var a = destroyer([1, 2, 3, 1, 2, 3], 2, 3);

document.write(JSON.stringify(a));

答案 1 :(得分:0)

我会在es6版本中编写它:

function destroyer( arr, ...elem ) {
    return arr.reduce( ( prev, next, index ) =>  elem.includes( arr[index] ) ? prev : prev.concat(next)  , [])
}