gpt4 book ai didi

javascript - 链接到 native Javascript 函数

转载 作者:行者123 更新时间:2023-11-29 16:05:11 24 4
gpt4 key购买 nike

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 

我们如何编写链接到 native 函数的函数?

最佳答案

方法链接与函数组合不兼容。但是,您可以创建一个容器类型,允许您在方法链接的上下文中组合纯函数,而不是修改内置原型(prototype)或依靠子类型:

function Box(x) {
return new.target ? (this.x = x, this) : new Box(x)
}

Box.prototype.fold = function fold(f) {return f(this.x)};
Box.prototype.map = function map(f) {return new Box(f(this.x))};
Box.prototype.toString = function toString() {return `Box(${this.x})`};

const id = x => x;

const stuff = [
{id: 1, name: 'foo', country: 'VN', age: 23},
{id: 2, name: 'bar', country: 'US', age: 25},
{id: 2, name: 'bat', country: 'VN', age: 34},
{id: 2, name: 'baz', country: 'VN', age: 45}
];

const filt = x => j => j.country === x;

const avg = (arr) => (arr.reduce((acc, i) => acc + i) / arr.length);

console.log(
Box(stuff.filter(filt('VN')).map(i => i.age))
.map(xs => avg(xs))
.fold(id) // yields 34
);

Box 是一个仿函数,您可以将任何类型的值放入此容器中。使用map,您可以将函数应用于仿函数内的值,并获得一个带有转换后的值的新仿函数。 fold 的行为相同,只是它返回裸值。

也许您已经注意到我的示例有点冗长,我可以省去映射。

关于javascript - 链接到 native Javascript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45136390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com