使用filter方法从数组中删除元素。

时间:2017-02-25 10:10:53

标签: javascript arrays

以下是我必须做的事情:

  

您将获得一个初始数组(该数组中的第一个参数)   驱逐舰功能),后跟一个或多个参数。移除所有   初始数组中与这些元素具有相同值的元素   参数。

我的代码:

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);

但它无法正常工作并返回初始数组而不是已过滤的数组。我的错误在哪里?

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
}