Javascript 从数组中筛选出特定值

Javascript 从数组中筛选出特定值,javascript,arrays,function,web,Javascript,Arrays,Function,Web,破坏者([1,2,3,1,2,3],2,3)应该返回[1,1],但它返回[1,2,3,1,2,3]。这个代码有什么问题 function destroyer(arr) { // Remove all the values var arg_num = arguments.length; var new_arr = arguments[0].filter(function(a){ for (var i = 1; i < arg_num; i++){ if (a

破坏者([1,2,3,1,2,3],2,3)
应该返回
[1,1]
,但它返回
[1,2,3,1,2,3]
。这个代码有什么问题

function destroyer(arr) {
  // Remove all the values
  var arg_num = arguments.length;

  var new_arr = arguments[0].filter(function(a){
    for (var i = 1; i < arg_num; i++){
      if (a === arguments[i]) a = false; 
    }
    return a;
  });

  return new_arr;
}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);
功能销毁程序(arr){
//删除所有值
var arg_num=arguments.length;
var new_arr=参数[0]。筛选器(函数(a){
对于(变量i=1;i
参数用于获取当前函数的参数列表。在执行筛选器时,您使用了参数,它给出了筛选器方法的参数。它不同于销毁程序方法参数

因此,将destroyer方法参数存储在一个变量中。 试试这个代码

功能销毁程序(arr){
//删除所有值
var args=参数;
var arg_num=args.length;
var标志;
var new_arr=参数[0]。筛选器(函数(a){
flag=false;
对于(变量i=1;i日志(销毁程序([0,2,3,0,2,3],0,3))参数用于获取当前函数的参数列表。在执行筛选器时,您使用了参数,它给出了筛选器方法的参数。它不同于销毁程序方法参数

因此,将destroyer方法参数存储在一个变量中。 试试这个代码

功能销毁程序(arr){
//删除所有值
var args=参数;
var arg_num=args.length;
var标志;
var new_arr=参数[0]。筛选器(函数(a){
flag=false;
对于(变量i=1;i日志(销毁程序([0,2,3,0,2,3],0,3))
问题在于
参数
关键字通常绑定到当前函数,在本例中,当前函数是
过滤器
中使用的匿名函数

ES6允许通过引入

(功能销毁程序(arr){
var arg_num=arguments.length;
返回参数[0]。筛选器(a=>{
对于(变量i=1;i
但是,请注意,此函数具有cost
n m
,其中
n
是数组中的元素数,
m
是附加参数数。但可能会更好

例如,如果附加参数始终是数字,则可以对它们进行排序,然后使用二分法搜索。这将花费
n lg(m)

另一种方法是使用哈希表。在最坏的情况下,它仍将花费
n m
,但平均只花费
n

(function destroyer(arr, ...args) {
  var s = new Set(args);
  return arr.filter(a => !s.has(a));
})([1, 2, 3, 1, 2, 3], 2, 3); // [1, 1]
如果不想手动实现,可以使用ES6集。其具体成本取决于实施,但要求平均为次线性

(function destroyer(arr, ...args) {
  var s = new Set(args);
  return arr.filter(a => !s.has(a));
})([1, 2, 3, 1, 2, 3], 2, 3); // [1, 1]

问题是
arguments
关键字通常绑定到当前函数,在本例中是
过滤器中使用的匿名函数

ES6允许通过引入

(功能销毁程序(arr){
var arg_num=arguments.length;
返回参数[0]。筛选器(a=>{
对于(变量i=1;i
但是,请注意,此函数具有cost
n m
,其中
n
是数组中的元素数,
m
是附加参数数。但可能会更好

例如,如果附加参数始终是数字,则可以对它们进行排序,然后使用二分法搜索。这将花费
n lg(m)

另一种方法是使用哈希表。在最坏的情况下,它仍将花费
n m
,但平均只花费
n

(function destroyer(arr, ...args) {
  var s = new Set(args);
  return arr.filter(a => !s.has(a));
})([1, 2, 3, 1, 2, 3], 2, 3); // [1, 1]
如果不想手动实现,可以使用ES6集。其具体成本取决于实施,但要求平均为次线性

(function destroyer(arr, ...args) {
  var s = new Set(args);
  return arr.filter(a => !s.has(a));
})([1, 2, 3, 1, 2, 3], 2, 3); // [1, 1]
您可以改为使用库中的函数。它是一个经过良好测试并广泛使用的实用程序库

var _ = require('lodash');

var result = _.difference([1, 2, 3, 1, 2, 3], [2, 3])); // returns [1, 1]
您可以改为使用库中的函数。它是一个经过良好测试并广泛使用的实用程序库

var _ = require('lodash');

var result = _.difference([1, 2, 3, 1, 2, 3], [2, 3])); // returns [1, 1]

当数组中的值为
0
时,函数将不起作用。您需要返回true of false而不是元素。如果值为
0
且不是要删除的列表,请尝试此操作。它将从过滤器中返回该元素,该元素为falsy且不在列表中。@jcubic是的,如果您正确,现在我更新了代码。感谢您提供的信息。当数组中的值为
0
时,您的函数将不起作用。您需要返回true of false而不是元素。如果值为
0
且不是要删除的列表,请尝试此操作。它将从过滤器中返回该元素,该元素为falsy且不在列表中。@jcubic是的,如果您正确,现在我更新了代码。感谢您提供的信息。请注意,ES6集合使用进行比较,而不是使用。对于
NaN
,它们的行为不同。请注意,ES6集合使用进行比较,而不是
=
使用的。由于
NaN
“应该”是一个强词,因为OP没有使用lodash。@Oriol将“应该”替换为can:)“应该”是一个强词,因为OP没有使用lodash。@Oriol将“应该”替换为can:)