【发布时间】:2017-07-17 05:14:45
【问题描述】:
tl;博士:
如何使用自己的函数链接到 Javascript 的 map()?喜欢 -
stuff.map(i => i.key).avg()
哪里 avg() 是我自己的函数来计算 map 返回的数组的平均值?
在从对象转向使用纯函数的函数式编程时,我失去了方便
return this;
这让我可以链接。
如果我有
let stuff = [
{id: 1, name: 'tuan', country: 'VN', age: 23},
{id: 2, name: 'nhung', country: 'US', age: 25},
...
//my own filter to pass as a param to native filter()
var filt = x => j => j.country === x;
//my own reducer for an array that computes an average
let avg = (arr) => (arr.reduce((acc, i) => acc + i) / arr.length);
然后
stuff.filter(filt('VN')).map(i => i.age)
会返回类似
的东西[23, 34, 45]
但是
stuff.filter(filt('VN')).map(i => i.age).avg()
给出一个类似
的错误filter().map().avg() is not a function
我们如何编写链接到原生函数的函数?
【问题讨论】:
-
Array.prototype 中添加了
avg()吗? -
avg(stuff.filter(filt('VN')).map(i => i.age)) ,试试这个
-
avg 是您的自定义函数,它不会添加到数组原型中。它接受一个参数并返回平均值,因此将数组作为您从地图和过滤器获得的参数传递
-
map().avg()工作的唯一方法是如果数组有avg()函数..因为 map 返回数组 -
developer.mozilla.org/en/docs/Web/JavaScript/Reference/…,您可以看到 map polyfill 是如何实现的(向下滚动一点)并通过更改逻辑相应地实现您的函数,您将能够通过将其添加到数组原型来访问您的函数.
标签: javascript arrays functional-programming method-chaining