我需要从数组中删除所有元素,并且要删除的所有元素都作为参数传递。 我试图使用筛选方法删除它们但它无法正常工作。 代码是:
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
答案 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
。
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;
答案 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) );