如何使用Array.filter而不是传统的循环-O(n ^ 2)?

时间:2017-07-13 15:23:49

标签: javascript arrays methods

提供初始数组(驱逐舰函数中的第一个参数),后跟一个或多个参数。从初始数组中删除与这些参数具有相同值的所有元素。

- >我正在尝试使用array.filter(),新的...而不是两个循环...这是代码...

function destroyer(arr) {
 var args = Array.from(arguments);
 var array = args.slice(1);
 //console.log(array);
  
return array.forEach(function(val){
 return arr.filter(function(tar){
  return tar!==val;  
 });
});
   }

var ans = destroyer([1, 2, 3, 1, 2, 3], 2, 3);
console.log(ans);
它没有得到我想要的解决方案?! 任何线索......

3 个答案:

答案 0 :(得分:1)

使用.indexOf()函数,您可以检查元素是否在数组中。

function destroyer(arr) {
    var args = Array.from(arguments)
    var array = args.slice(1)

    return arr.filter(function(v){
        return array.indexOf(v) === -1
    })
 }

var ans = destroyer([1, 2, 3, 1, 2, 3], 2, 3);

console.log(ans)将显示[1, 1]

答案 1 :(得分:1)

您的方法运行正常,您只是没有正确返回值。

更好的方法是使用过滤器本身作为另一个答案的建议,但如果由于某种原因你想要它用forEach做,并在这里过滤如何。

function destroyer(arr) {
 var args = Array.from(arguments);
 var array = args.slice(1);
 
  array.forEach(function(val){
   arr = arr.filter(function(tar){
      return tar!==val;  
   });
  });
  return arr;
}

var ans = destroyer([1, 2, 3, 1, 2, 3], 2, 3);
console.log(ans);

答案 2 :(得分:0)

您可以使用以下内容。这有一个复杂的O(N * M),我认为这是你最好的。



function destroyer(arr) {
  var args = Array.from(arguments);
  var array = args.slice(1);
  
  return arr.filter(function(tar){
    return array.indexOf(tar) === -1;
  });
}

var ans = destroyer([1, 2, 3, 1, 2, 3], 2, 3);
console.log(ans);