以下是我必须做的事情:
您将获得一个初始数组(该数组中的第一个参数) 驱逐舰功能),后跟一个或多个参数。移除所有 初始数组中与这些元素具有相同值的元素 参数。
我的代码:
function destroyer(arr) {
for(i=1; i < arguments.length; i++) {
x = arr.filter(filterer);
}
function filterer(val) {
return val !== arguments[i];
}
return x;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
但它无法正常工作并返回初始数组而不是已过滤的数组。我的错误在哪里?
答案 0 :(得分:3)
基本上,你有两个问题,
arguments[i]
错误的内容,在过滤函数的回调中,
function destroyer(arr) { function filterer(val) { // <--------------------+ return val !== arguments[i]; // | // ^^^^^^^^^^^^ this points to --+ } for(i=1; i < arguments.length; i++) { x = arr.filter(filterer); } return x; }
没有为进一步过滤分配结果。
解决方案
在测试值上使用带闭包的函数,并返回一个函数,以便在过滤方法中进一步测试。
使用带arr
的变量作为起始值并指定过滤结果。然后在结尾处返回此值。
function destroyer(arr) {
function filterer(testValue) { // take arguments[i] value
return function (val) { // return function as callback
return val !== testValue; // use testValue instead of arguments[i]
}
}
var x = arr // assign arr as start value for filtering
for (var i = 1; i < arguments.length; i++) {
x = x.filter(filterer(arguments[i])); // use filterer with a parameter
}
return x; // return result
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));
答案 1 :(得分:1)
arguments
范围已更改。
您希望在arguments[i]
内使用function filterer(val) {return val !== arguments[i];}
,因为它是父函数destroyer
的参数。
如果是,请使用filterer
作为箭头功能以保持arguments
的范围。
function destroyer(arr) {
const filterer = (val) => { // ⚠️ This is an arrow function
return val !== arguments[i]; // ⬅️ "arguments" refers now to "destroyer()" args
}
for(i=1; i < arguments.length; i++) {
x = arr.filter(filterer);
}
return x;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
答案 2 :(得分:1)
制作一个arguments对象的副本。正如Abdennour所说,论证范围反对过滤器的变化。
此外,复制输入数组并继续从该数组中过滤。否则,您的结果将被过滤掉最后一个参数。
func tableView(_ tableView: UITableView,heightForRowAt indexPath:IndexPath) -> CGFloat
{
return UITableViewAutomaticDimension
}
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat
{
return 100
}