此代码返回正确的数组,但我在arrayFilter
函数内作弊。通过使用matchItem[0]
和matchItem[1]
,我很难编写仅使用2个过滤条目的代码。如果小于2,则测试将失败,如果超过2,则不会过滤额外项目。
function destroyer(arr) {
// Remove all the values
var destroyerArgsAmount = arguments.length;
var matchArr = arguments[0];
var newArr = [];
var matchItems = [];
for(i = 1; i < destroyerArgsAmount; i++) {
matchItems.push(arr[i]);
}
function arrayFilter(val) {
if(val != matchItems[0] && val != matchItems[1]) {
return true;
}
}
arr = matchArr.filter(arrayFilter);
return arr;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
为什么for循环在这种情况下不起作用?
for(i = 0; i < matchItems.length; i++) {
if(matchItems[i] != value) {
return value;
}
当放入arrayFilter
函数
有人可以向我解释为什么然后让我找到正确的方法来完成这项工作吗?我认为这将是一个重要的事情要掌握,因为有很多方法采用这种方式:filter,map,forEach等等我还不知道。
答案 0 :(得分:4)
我不能确定您尝试实现的结果,因为您尚未对其进行解释但是,我从您的代码中假设您的功能正在尝试{{1}在第一个参数filter
之后传递的所有参数。像这样:
array
答案 1 :(得分:3)
您似乎需要一种检查数值是否在数组中的方法。
如@adeneo所述,如果val
是原始值(字符串,数字等)或应通过引用进行比较的对象,则解决方案就像
matchItems.indexOf(val)
如果val
是matchItems
中的其中一项,则{p>返回正数(索引),否则返回-1
。
如果您的用例稍微复杂一些,例如,如果matchItems包含对象,并且您想要查看具有特定属性的对象是否在其中,则可以使用Array.prototype.some:
var found = matchItems.some(function(item){
return item === val; // use the apropriate comparison here
});
您的完整代码将是:
function destroyer(arr) {
var matchItems = Array.prototype.slice.call(arguments, 1);
return arr.filter(function(a) {
return !matchItems.some(function(b){
return a === b;
});
});
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
答案 2 :(得分:1)
使用indexOf并返回结果
function arrayFilter(val) {
return matchItems.indexOf(val) === -1;
}
我想也许你正在寻找更像这样的东西
function destroyer() {
var args = [].slice.call(arguments),
matchArr = args.shift();
return matchArr.filter(function(item) {
return args.every(function(item2) {
return item !== item2;
});
});
}
答案 3 :(得分:0)
我也在进行免费代码营的挑战!这段代码克服了挑战:
function destroyer(arr) {
var arr = arguments[0];
for (var i = 0; i < arr.length; i++) {
for (var j = 1; j < arguments.length; j++) {
if (arr[i] === arguments[j]) {
arr.splice(i, 1);
i--;
}
}
}
return arr;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);