我们可以使用reduce作为地图和过滤器,如何在JavaScript中使用过滤器来实现地图功能?

时间:2019-08-05 17:29:30

标签: javascript arrays dictionary filter

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

4 个答案:

答案 0 :(得分:0)

Array.prototype.filter仅过滤数组中的现有值,基于过滤功能,有效地创建一个可以容纳相同值,其子集或空数组的新数组。

答案 1 :(得分:0)

您可以使用filter()

const arr = [1, 2, 3];

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

console.log(arr)

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

答案 2 :(得分:0)

正如许多次所说,没有理由应该这样做。

不可能像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)

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

答案 3 :(得分:-1)

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

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

filter

这样一来,您甚至无需破坏函数范围就可以做到!

如果您要执行此操作而不必一定要具有一个变量来最初调用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