|
|
1
77
你应该使用
如。
[编辑:当然可以
|
|
|
2
28
我刚才写了一个答案,我的意见改变了。我建议检查一下我的 blog post 这就扩展了这个主题,并更好地解释了它。在备选方案的末尾,它还提供了一个JSPERF比较。
TL;DR是:
为了完成您所要求的(在一个函数调用中过滤和映射),您应该使用
下面是如何
你给reduce一个参数,它是一个(通常是匿名的)函数。 那个匿名函数 接受两个参数——一个(像传递给map/filter/foreach的匿名函数)是要操作的迭代器。但是,对于传递给reduce的匿名函数还有另一个参数,即那些函数不接受,也就是说 在函数调用之间传递的值,通常称为 备忘录 . 注意,虽然array.filter()只接受一个参数(一个函数),array.reduce()也接受一个重要的(尽管可选)第二个参数:“memo”的初始值将作为其第一个参数传递给匿名函数,随后可以在函数调用之间进行变异和传递。(如果未提供,则第一个匿名函数调用中的“memo”默认为第一个迭代器,“迭代器”参数实际上是数组中的第二个值) 在我们的例子中,我们将首先传递一个空数组,然后根据我们的函数选择是否将迭代器注入到数组中——这是过滤过程。 最后,我们将在每个匿名函数调用上返回“array in progress”,reduce将获取该返回值并将其作为参数(称为memo)传递给下一个函数调用。 这允许过滤器和映射在一个迭代中发生,从而将所需的迭代次数减少一半。:) 有关更完整的解释,请参阅 MDN 或者上面的链接。:) reduce调用的基本示例:
更简洁的版本:
注意,第一个迭代器不大于一个,所以被过滤了。还要注意草签备忘录,它的名字只是为了让它的存在变得清晰并引起人们的注意。再次,它作为“memo”传递给第一个匿名函数调用,然后匿名函数的返回值作为“memo”参数传递给下一个函数。 备忘录的另一个典型用例是返回数组中最小或最大的数字。例子:
关于如何编写自己的reduce函数的示例(我发现,这通常有助于理解这些函数):
例如,真正的实现允许访问索引之类的东西,但我希望这能帮助您对索引的要点有一种简单的感觉。 |
|
|
3
11
这不是地图的作用。你真的想要 Array.filter . 或者,如果您真的想从原始列表中删除元素,则需要使用for循环来强制执行。 |
|
4
3
但是,您必须注意
这样做,你可以原型任何你可能需要的方法。 |
|
5
3
我把这个答案放在这里是因为这个页面上共享的polyfill非常糟糕
扩展原型
|
|
|
6
2
|