我试图根据传递变量删除一些单词。
但是,我写了两个版本的代码,这些代码有些不同!
他们产生了不同类型的输出,我不明白为什么!
所以我需要你们的帮助,非常感谢你们!
此功能将接受不同数量的变量,
可能是([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]。
那么第一个版本出了什么问题???谢谢!!
答案 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) , [])
}