[英]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.