繁体   English   中英

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

[英]How to remove elements from an array using filter() in JavaScript?

我需要从数组中删除所有元素,所有要删除的元素都将作为参数传递。 我正在尝试使用过滤器方法将其删除,但无法正常工作。 代码是:

 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挑战

您需要返回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参数的浏览器:

 function destroyer(arr, ...args) { return arr.filter(v => args.indexOf(v) === -1); } console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3)); 

您需要更改过滤器功能,检查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); 

仅作记录,您的代码的问题是您每次都循环遍历args的所有元素,因此,如果arr的任何元素与args的任何元素匹配,则返回false(忽略传递给回调的实际值)。

要修复您的代码,请摆脱该循环并针对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); 

完成此操作后,很容易看到如何将其减少(使用rest参数和箭头函数)为:

 function destroyer(arr, ...args) { return arr.filter(v => !args.includes(v)); } console.log( destroyer([1, 2, 3, 1, 2, 3], 2, 3) ); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM