2015-09-02 113 views
1

使用纯JavaScript,从数组开始,我想通过删除与第二个数组中的任何值匹配的值来返回数组。javascript:从第二个数组中的数组中删除值

我已经解决了这个问题,但我相信有更多的代码比真的有必要。

我希望只使用JavaScript更简洁或优雅的解决方案。

function removeValues(arr){ 
    array = arguments[0]; 
    args = Array.prototype.slice.call(arguments); 
    len = arguments.length; 
     filtered = array.filter(function(n){ 
      x = true; 
      for (var i = 1; i < len; i++) { 
       if (n == args[i]) { x = false; } 
      } 
      return x; 
     }); 
    return filtered; 
} 

removeValues([1,2,3,1,2,3],2,3); 

应该使用一个函数,该函数使用一个或多个附加参数中的值从第一个参数(数组)中删除值。

+0

http://api.jquery.com/jquery.grep/但它不是纯JS ......使用 –

+1

仅纯JavaScript – dtburgess

+0

为什么会有人使用jQuery这个? – Nit

回答

3

当你与filter功能工作是没有必要的,因为你在一个循环中是已经使用的循环。转换的论点之后到一个数组与[].slice.call(arguments),你可以使用indexOf,负责在数组中返回一个值的位置,如果值不存在,这将返回-1,所以我们将采取一切都-1

结果

您的代码就可以减少,以及:

function removeValues(arr){ 
 
    return arr.filter(function(val){ 
 
    return [].slice.call(removeValues.arguments).slice(1).indexOf(val) === -1 
 
    }) 
 
} 
 

 
console.log(removeValues([1,2,3,1,2,3],2,3))


ES6方法:使用Rest parametersArrow Functions

enter image description here

+0

你能解释一下这个答案吗? – dtburgess

+0

如果你的意思是ES6的方法,你可以去2个类型的链接,是在哪里详细解释*休息参数*和*箭头函数*,操作是相同的 –

3

试试这个...

function removeValues(){ 
    var args = Array.prototype.slice.call(arguments).slice(1); 
    return arguments[0].filter(function(value) { 
     return args.indexOf(value) === -1; 
    }); 
} 

removeValues([1, 2, 3, 1, 2, 3], 2, 3); 

它做同样的事情,但稍微收拾它。

+1

'Array.prototype.slice.call(arguments)',也取第一个参数,确切的应该是:'Array.prototype.slice.call(arguments).slice(1)'。 'args ='在严格模式下会失败,应该声明为局部变量** var args = ** –

+0

斑点 - 谢谢。我完全错过了! – Archer

1

尝试这样的:

var array1 = [ 1, 2, 3, 4, 5 ]; 
var array2 = [ 2, 3 ]; 

var result = array1.filter(function (elem) { 
    return array2.indexOf(elem) === -1; 
}); 

见例如:Running code

相关问题