繁体   English   中英

JavaScript使用过滤器和循环从阵列中删除多个值

[英]JavaScript Remove Multiple Values from Array Using Filter and Loop

我是新来的,需要一些帮助来编写函数destroyer()以从数组中删除多个值。

destroyer()函数传入一个数组和其他数字作为参数。 我们的想法是从数组中删除数字。

例如

destroyer([1, 2, 3, 1, 2, 3], 2, 3) 

输出: [1, 1]

destroyer(["tree", "hamburger", 53], "tree", 53) 

输出: ["hamburger"]

destroyer([2, 3, 2, 3], 2, 3) 

输出: []

注意:示例仅显示要删除的2个附加数字。 但是函数destroyer()应该能够删除任意数量的值(即4个,5个或6个参数)。

但是,我的代码不会产生相同的结果。 具体来说,使用console.log,我发现我的过滤器功能没有正确循环。

1)任何人都可以帮我调试吗?

2)有没有更好的方法来编写这个函数?

非常感谢你!!!

function destroyer() {

  var args = Array.prototype.slice.call(arguments); 

  var itemToRemove = args.slice(1);
  console.log(itemToRemove);
  var newArr = args[0];
  console.log(newArr);

  function filterer(value) { 

    for (var i = 0; i < itemToRemove.length; i++) {
      console.log(i);
      console.log(itemToRemove[i]);
      if (value != itemToRemove[i]) {
        return value;
      }
    } 
   }

  return newArr.filter(filterer);
}

您的filterer功能可以更简单:

function filterer (value) {
    return itemToRemove.indexOf(value) === -1;
}

与时间复杂度方面的对象属性查找相比,使用Array.prototype.indexOf()可能效率低下。 我建议一次循环其他参数并构造一个目标元素作为键被销毁的对象。 然后,您可以在传递给Array.prototype.filter()的过滤回调中检查给定值是否为目标。

function destroyer() {
    var arr = arguments.length && arguments[0] || [];
    var targets = {};
    for (var i = 1; i < arguments.length; i++) {
        targets[arguments[i]] = true;
    }
    return arr.filter(function (x) {
        return targets[x] === undefined;
    });
}

这种方法的一个缺点是,并非JS中的所有值都可以是对象的有效属性,因为属性必须是字符串。 在这种情况下,您只是使用数字作为键,这些数字被隐式转换为字符串。

我们可以在filter()方法中将参数传递给我们的回调函数。

function destroyer(arr) {
  return arr.filter(filterer(arguments)); // Pass arguments
}

function filterer(args) {
  return function(value) { // Actual filter function
    for (var i = 1; i < args.length; i++) {
      if (value === args[i]) // Seek
        return false; // Destroy
    }
    return true; // Otherwise keep
  };
}

这传递了freeCodeCamp的所有5个测试用例 基本算法脚本| 寻求和毁灭

以下代码将从数组中删除元素。 它删除的元素由任何额外参数定义。 ...remove是一项ES6功能,可将额外参数聚合到一个数组中。

我将迭代...remove数组并从我们正在处理的主数组中删除该元素。

这是一个JSFiddle: https ://jsfiddle.net/zzyopnnp/

...extra_parameters在大多数浏览器中不支持...extra_parameters ,您可能希望使用arguments对象。

function removeIndex(array, index) {if(index>-1){array.splice(index, 1);}}

function destroyer(array, ...remove) {
    remove.forEach(function(elem, index) {
        removeIndex(array, index);
    });
};

var arr = ["tree", "hamburger", 53];
destroyer(arr, "tree", 53);
console.log(arr);

一个简单的功能

function filter(arr, arg1, arg2){

    var j = arr.length;
    while(j){

       if (arr.indexOf(arg1) > -1 || arr.indexOf(arg2) > -1){
          arr.splice(j - 1, 1);
       }
       j--
    }
}

对于多个参数

一个简单的功能

function filter(){
    var j = -1; 
    for(var i = 1; i < arguments.length; i++){
        j = arguments[0].indexOf(arguments[i]);
        if(j > -1){
           arguments[0].splice(j, 1);
        }
    }
    return arguments[0];
}

你可以调用这个没有args的函数,例如:

 filter([1,2,3,4,5,6,7,8,9], 1, 3, 5); //return [2,4,6,7,8,9]
 filter([1,2,3,4,5,6,7,8,9], 1); //return [2,3,4,5,6,7,8,9]

这里有很好的答案,但你可以用这种方式做得非常干净,记住你在filter方法中有一个对象选项,你可以在回调函数中使用,在这种情况下我使用它就像: arguments [i]所以我可以检查arguments数组中的每个值

function destroyer(arr) {

   for(var i = 1; i < arguments.length; i++){
     arr = arr.filter(isIn, arguments[i]);
   } 

   function isIn(element,index, array){
      if (element != this){
         return element;
      }
   }  
   return arr;
}

暂无
暂无

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

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