【问题标题】:Array.Filter not updating arrayArray.Filter 不更新数组
【发布时间】:2017-01-23 09:04:10
【问题描述】:

任务是:

您将获得一个初始数组(第一个参数在 destroyer 函数),后跟一个或多个参数。移除所有 初始数组中与这些具有相同值的元素 论据。

在处理它时,我发现了一些我难以理解的 Array.filter 行为:

function destroyer(arr) {
  for (var i = 1; i<arguments.length; i++){
    toDelete = arguments[i];
    arr.filter(isItIn);
  }
  return arr;
}

function isItIn(item, undefined, array){
  return item!=toDelete;
}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);

我的意图是遍历参数的 1+ 项,每次调用 arr.filterArr.filter 然后调用isItIn 检查当前检查的项目是否是我正在搜索的项目。但是,arr 原封不动地返回。当我将isItIn 更改为:

function isItIn(item, undefined, array){
  return item==1;
}

进行测试,它仍然没有改变,但是console.logs 在isItIn 的原始写作中表明它正在正确接收参数(或者至少我认为可以确定。

请注意,我已经通过另一条途径解决了这个问题,我不是在寻找解决问题的方法,只是解释我的初始代码哪里出错了。

【问题讨论】:

    标签: javascript arrays filter


    【解决方案1】:

    基本上你使用Array#filter 并省略它的结果。

    您需要将过滤器的结果分配给前一个数组。

    arr = arr.filter(isItIn);
    

    function destroyer(arr) {
        for (var i = 1; i < arguments.length; i++) {
            toDelete = arguments[i];
            arr = arr.filter(isItIn);
        }
        return arr;
    }
    
    function isItIn(item) {
        return item != toDelete;
    }
    
    console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));

    【讨论】:

    • 哦,我的...如果你知道我看了多久,
    【解决方案2】:

    你必须分配返回的数组:

    function destroyer(arr) {
        for (var i = 1; i<arguments.length; i++) {
            toDelete = arguments[i];
            arr = arr.filter(isItIn);
        }
        return arr;
     }
    

    【讨论】:

      猜你喜欢
      • 2021-01-04
      • 2019-09-13
      • 1970-01-01
      • 2020-11-13
      • 1970-01-01
      • 2012-12-02
      • 2017-08-28
      • 2018-04-24
      相关资源
      最近更新 更多