2015-09-23 26 views
0

所以我有这个代码,它做它需要做的,它返回一个输入数组减去任何与数组后面的参数相匹配的值。但是,我无法弄清楚如何迭代所有参数。这里是我的工作 -如何迭代这些参数来过滤数组?

function destroyer(arr) { 
    var arg2 = arguments[1]; 
    var arg3 = arguments[2]; 
    var arg4 = arguments[3]; 
    var result = arr.filter(function(arg) { 
    if (arg != arg2 && arg != arg3 && arg != arg4) { 
     return (arg); 
    } 
    }); 
    return result; 
} 
destroyer([1, 2, 3, 1, 2, 3], 2, 3); 

这里是我尝试迭代所有参数与for循环。它不工作,我努力概念化正是我通过我在这里arr.filter回调抽 -

function destroyer(arr) { 
    var result = arr.filter(function(arg) { 
    for (var i = 1; i < arguments.length; i++) { 
     if (arg != arguments[i]) { 
     return (arg); 
     } 
    } 
    }); 
    return result; 
} 
destroyer([1, 2, 3, 1, 2, 3], 2, 3); 

这是接近的地方,我需要还是我在这里下车呢?

回答

1

对每个函数调用都设置了arguments变量,包括调用.filter()回调函数。因此在回调中的arguments不是你认为的那样。

你可以做你试图用.indexOf做什么,你需要他们的论点复制到另一个阵列:

function destroyer(arr) { 
    var badValues = []; 
    for (var i = 1; i < arguments.length; ++i) 
    badValues = arguments[i]; 
    return arr.filter(function(value) { 
    return badValues.indexOf(value) < 0; 
    }); 
} 

这是流行使用.slice()复制arguments的全部或部分对象:

var badValues = [].slice.call(arguments, 1); 

你可以做,如果你喜欢的简洁,但经过arguments对象了功能使得它很难优化。

+0

谢谢我得到了这个工作的版本。值得注意的变化是将参数推送到badValues并设置过滤函数来测试索引=== -1。 – slurrr

+1

@slurrr对不起,我得到了测试:)很高兴你成功了! – Pointy