Javascript,遍历数组和参数 "object"
Javascript, looping through an array and the arguments "object"
我无法理解这个问题,我正在使用 filter 循环遍历数组并过滤掉所有作为参数传递的整数,我不受参数数量的限制。
但是当它要返回函数 arguments 对象的值时,我被困在这里,至少不止一次。
在我下面的代码中,显然它没有完全工作,因为我在 for…in
循环中做了一个 return
,这是我不知道如何获得第二个的地方循环而不用 i
重新初始化为 0
…
function destroyer(arr) {
var args = arguments.length;
var arg0 = arguments[0];
var Nargs = Array.prototype.slice.call(arguments, 1);
var newArr = [];
newArr = arg0.filter(filtre);
/*Only the first argument is
filtered out,here it's the value "2",
but should filter out [2,3].
The expected result is [1,1]*/
console.log(newArr);
return newArr;
function filtre(e){
for (var i in Nargs){
return e !== Nargs[i];
}
}
}
destroyer([1, 2, 3, 1, 2, 3], 2,3);
希望这已经够清楚了,
感谢任何输入!
数学
因为你的 filtre 函数中的 return 语句总是在第一个 运行 上执行,它只是 return 判断 Nargs 中的第一个数字是否等于当前项目.相反,您可以使用 indexOf 来获得完整的浏览器支持(returns 数组中项目的索引,如果不在数组中则为“-1”)而不是循环(或包含,或循环等,如下所示):
function destroyer(arr) {
var args = arguments.length;
var arg0 = arguments[0];
var Nargs = Array.prototype.slice.call(arguments, 1);
var newArr = [];
function filtre(e){
return Nargs.indexOf(e) === -1;
}
newArr = arg0.filter(filtre);
console.log(newArr);
return newArr;
}
destroyer([1, 2, 3, 1, 2, 3], 2,3);
如果您不需要 Internet Explorer 支持,您可以使用 Array.includes
:
function filtre(e){
return !Nargs.includes(e);
}
最后,如果您真的想要使用循环,您只想过滤一个项目(return false)一旦找到它否则允许它( return 真):
function filtre(e){
for (var i = 0, l = Nargs.length; i < l; i++) {
if (e === Nargs[i])
return false;
}
return true;
}
虽然 rgthree 提供了一个与您已有的解决方案非常相似的解决方案,但我想提供一个利用现代浏览器的更新 ES6 功能的解决方案。如果你通过 Babel 运行 这个,它会产生与那个解决方案基本相同的代码,尽管它仍然需要一个 shim 来进行 includes
调用。
function destroyer(source, ...args) {
return source.filter(el => !args.includes(el));
}
解释:
...args
使用 spread operator 将除第一个参数之外的所有参数都放入名为 args
的数组中。
我们可以直接return过滤后的数组,假设您不需要记录它,那只是为了调试。
el => !args.includes(el)
是匿名 arrow function。由于没有使用大括号,它会自动 return 表达式的结果。
由于args
是一个数组,我们可以直接使用Array.prototype.includes来判断当前元素是否在要移除的参数中。如果它存在,我们要将其删除,从而将 return 反转为 !
。替代方案可能如下:el => args.includes(el) == false
。
我无法理解这个问题,我正在使用 filter 循环遍历数组并过滤掉所有作为参数传递的整数,我不受参数数量的限制。
但是当它要返回函数 arguments 对象的值时,我被困在这里,至少不止一次。
在我下面的代码中,显然它没有完全工作,因为我在 for…in
循环中做了一个 return
,这是我不知道如何获得第二个的地方循环而不用 i
重新初始化为 0
…
function destroyer(arr) {
var args = arguments.length;
var arg0 = arguments[0];
var Nargs = Array.prototype.slice.call(arguments, 1);
var newArr = [];
newArr = arg0.filter(filtre);
/*Only the first argument is
filtered out,here it's the value "2",
but should filter out [2,3].
The expected result is [1,1]*/
console.log(newArr);
return newArr;
function filtre(e){
for (var i in Nargs){
return e !== Nargs[i];
}
}
}
destroyer([1, 2, 3, 1, 2, 3], 2,3);
希望这已经够清楚了,
感谢任何输入!
数学
因为你的 filtre 函数中的 return 语句总是在第一个 运行 上执行,它只是 return 判断 Nargs 中的第一个数字是否等于当前项目.相反,您可以使用 indexOf 来获得完整的浏览器支持(returns 数组中项目的索引,如果不在数组中则为“-1”)而不是循环(或包含,或循环等,如下所示):
function destroyer(arr) {
var args = arguments.length;
var arg0 = arguments[0];
var Nargs = Array.prototype.slice.call(arguments, 1);
var newArr = [];
function filtre(e){
return Nargs.indexOf(e) === -1;
}
newArr = arg0.filter(filtre);
console.log(newArr);
return newArr;
}
destroyer([1, 2, 3, 1, 2, 3], 2,3);
如果您不需要 Internet Explorer 支持,您可以使用 Array.includes
:
function filtre(e){
return !Nargs.includes(e);
}
最后,如果您真的想要使用循环,您只想过滤一个项目(return false)一旦找到它否则允许它( return 真):
function filtre(e){
for (var i = 0, l = Nargs.length; i < l; i++) {
if (e === Nargs[i])
return false;
}
return true;
}
虽然 rgthree 提供了一个与您已有的解决方案非常相似的解决方案,但我想提供一个利用现代浏览器的更新 ES6 功能的解决方案。如果你通过 Babel 运行 这个,它会产生与那个解决方案基本相同的代码,尽管它仍然需要一个 shim 来进行 includes
调用。
function destroyer(source, ...args) {
return source.filter(el => !args.includes(el));
}
解释:
...args
使用 spread operator 将除第一个参数之外的所有参数都放入名为 args
的数组中。
我们可以直接return过滤后的数组,假设您不需要记录它,那只是为了调试。
el => !args.includes(el)
是匿名 arrow function。由于没有使用大括号,它会自动 return 表达式的结果。
由于args
是一个数组,我们可以直接使用Array.prototype.includes来判断当前元素是否在要移除的参数中。如果它存在,我们要将其删除,从而将 return 反转为 !
。替代方案可能如下:el => args.includes(el) == false
。