【问题标题】:Removing the specific arguments删除特定参数
【发布时间】:2016-05-25 04:33:17
【问题描述】:

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

但是,我写了两个版本的代码,它们有细微的不同!

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

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

这个函数将接受不同数量的变量,

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

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

例如:destroyer ( [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]。

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

【问题讨论】:

标签: javascript filter arguments default-arguments


【解决方案1】:

第一个问题是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));

【讨论】:

  • 哈哈,我正准备发布您发布的第二个版本逐字(好吧,我使用了Array.from(arguments);,但除此之外......)。干杯!
  • @RobM。 - 我也添加了 ES6 版本。
  • 如果你要去 ES2015 ... return arr.filter(value =&gt; !~args.indexOf(value)) ... 或 ... return arr.filter(value =&gt; !args.includes(value))
  • return arr.filter(value =&gt; !args.includes(value)) 现在我们有 Array.includes。虽然@jfriend00 的回答非常好,但如果我有两个赞成票,你就会两个。哈哈,现在@JaromandaX 也让我大吃一惊,也许该睡觉了……
  • 一行 FTW - var destroyer = (arr, ...args) =&gt; arr.filter(value =&gt; !args.includes(value)); ... @RobM。这听起来有点反手评论:p
【解决方案2】:

我会在 es6 版本中这样写:

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

【讨论】:

  • 感谢您的帮助!! @Avraam Mavrids
猜你喜欢
  • 1970-01-01
  • 2022-01-04
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多