【问题标题】:How to achieve map functionality with the use of filter in JavaScript, as we can use reduce as map and filter?如何在 JavaScript 中使用 filter 来实现 map 功能,因为我们可以使用 reduce 作为 map 和 filter?
【发布时间】:2019-08-05 17:29:30
【问题描述】:

假设我有一个数组var arr = [1,2,3],如果我有var result = arr.filter(callback),我希望result 的值是[2,4,6],使用过滤器。我只想定义回调函数以便这样做。使用地图可以轻松完成,但我只想使用过滤器。

【问题讨论】:

  • 但为什么是¯\_(ツ)_/¯?在这里使用filter 有什么具体原因吗?
  • 过滤器不是为此而建的.....我可以用锤子打开一个窗口,但还有更好的选择。
  • 这就像在你已经拿到钥匙的情况下试图用发夹打开锁一样。
  • 我知道我有地图,但我需要知道的是有没有办法做到这一点
  • 是的,它可以通过使用传入的参数以一种可怕的方式......但是为什么......

标签: javascript arrays dictionary filter


【解决方案1】:

Array.prototype.filter 仅过滤数组中的现有值,根据过滤函数有效地创建一个新数组,该数组可以保存相同的值、它们的子集或空数组。

【讨论】:

    【解决方案2】:

    您可以使用filter()

    const arr = [1, 2, 3];
    
    arr.filter((c, i) => {
      arr[i] = +arr[i] * 2;
      return true;
    });
    
    console.log(arr)

    我们总是返回true,所以filter() 在这种情况下毫无意义。

    【讨论】:

    • 好的,我已经尝试过了,但是如果我想像[1, 2, 3].filter(callback);那样使用它就不行了
    • 我的意思是如果在使用过滤器之前我没有将数组存储在变量中
    • @Abhishek-Saini 我认为像[1, 2, 3].filter(callback); 这样的方式是不可能的,因为我们无法返回值。
    【解决方案3】:

    正如多次所说,你没有理由这样做。

    不可能像 map 那样做,因为 map 返回一个新数组。您可以更改原始数组,也可以复制原始数组,以免更改它。

    // this modifies the orginal array
    var arr1 = [1,2,3]
    arr1.filter((v,index,arr)=>{
      arr[index] = v * 2;
      return true
    })
    console.log(arr1)
    
    // or you can clone it and do the same thing
    // this modifies the cloned array
    var arr2 = [1,2,3]
    var arr3 = arr2.slice()
    arr3.filter((v,index,arr)=>{
      arr[index] = v * 2;
      return true
    })
    console.log(arr2, arr3)

    所以不,您不能使用过滤器重新创建地图,因为您必须修改原始数组或作弊并使用数组的副本。

    【讨论】:

      【解决方案4】:

      所以我不确定我是否理解你问题的第二部分,但至于第一部分:

      filtercallback 具有三个参数,其中两个是可选的。 第一个参数是遍历中的当前元素,第二个和第三个参数(可选的)是当前元素的从0开始的索引,以及对原始数组的引用。 这第三个参数对于您要执行的操作很有用。

      let myArr = [1, 2, 3];
      
      myArr.filter((el, ind, orig) => {
        orig[ind] = orig[ind] + 1; // Or, whatever map logic you want to use
        return true; // since a Boolean condition must be returned here
      });

      这样你就可以做到,甚至不必破坏函数的范围!

      如果您想在不必使用最初调用filter 的变量的情况下执行此操作(您必须传递一个数组),您可以使用原型和call 方法:

      Array.prototype.filter.call([1, 2, 3], (el, ind, orig) => {
        orig[ind] = orig[ind] + 1;
        return true;
      });

      【讨论】:

        猜你喜欢
        • 2017-06-07
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 2017-11-05
        • 1970-01-01
        • 2012-11-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多