Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一个可以在Javascript中组合和链接(点表示法)的函数_Javascript_Functional Programming_Lodash_Ramda.js - Fatal编程技术网

一个可以在Javascript中组合和链接(点表示法)的函数

一个可以在Javascript中组合和链接(点表示法)的函数,javascript,functional-programming,lodash,ramda.js,Javascript,Functional Programming,Lodash,Ramda.js,我正在尝试转换一个旧的api,该api使用了大量需要保留的点符号链接,即: [1,2,3,4].newSlice(1,2).add(1) // [3] 我想在这个例子中添加功能性的构图风格Ramda,但lodash或其他可以: const sliceAddOne = R.compose(add(1), newSlice(1,2)) sliceAddOne([1,2,3,4])// [3] 我的问题是如何在我的函数newSlice中同时进行链接和合成该函数是什么样子的 我有一个小例子。编辑

我正在尝试转换一个旧的api,该api使用了大量需要保留的点符号链接,即:

[1,2,3,4].newSlice(1,2).add(1) // [3]
我想在这个例子中添加功能性的构图风格Ramda,但lodash或其他可以:

const sliceAddOne = R.compose(add(1), newSlice(1,2)) 
sliceAddOne([1,2,3,4])// [3]
我的问题是如何在我的函数
newSlice
中同时进行链接和合成该函数是什么样子的

我有一个小例子。

编辑

我想我一开始误解了你。您需要一个函数
f
,可以作为

f(...args)(someObj) ===  someObj.f(...args)
我会这样做

// infix
Array.prototype.newSlice = function(x,y) { return this.slice(x,y) }

// prefix 
const newSlice = (x,y) => F => F.newSlice(x,y)
这是一个很好的设计,因为您可以在任何希望具有
newSlice
功能的对象上实现
newSlice
,并且前缀函数可以正常工作。这还允许您在每种对象类型(数组、字符串、其他…)上都有一个独特的
newSlice
实现,因为我们正在切片的底层数据可能会有所不同–您无需在函数体中执行愚蠢的条件
检查即可获得所有这些

//新闻片::[a]->(整数,整数)->[a]
Array.prototype.newSlice=函数(x,y){
返回此.slice(x,y)
}
//新闻片::字符串->(整数,整数)->字符串
String.prototype.newSlice=函数(x,y){
返回此.substring(x,y)
}
//甚至在自定义对象上
类彩票{
构造函数(…nums){this.nums=nums}
newSlice(x,y){返回this.nums.slice(x,y)}
}
//新闻片::(数组,字符串)a=>(整数,整数)->a->a
const newSlice=(x,y)=>F=>F.newSlice(x,y)
//在前缀位置使用它
console.log(newSlice(1,2)([1,2,3,4]))/[2]
console.log(newSlice(1,2)(“abcd”)/“b”
console.log(newSlice(1,2)(newlototicket(9,8,7))/[8]
//使用中缀位置
console.log([1,2,3,4].newSlice(1,2))/[2]
console.log(“abcd.newSlice(1,2))/“b”

console.log((新的lototicket(9,8,7)).newSlice(1,2))//[8]
谢谢你的指针,这就是为什么我倾向于使用ramda,因为所有函数都是curry:)@cmdv我似乎误解了你最初的意图。我用一种新的理解重新修改了我的答案。谢谢你,非常彻底,我有足够的时间来理解你的答案。我必须向Array+String添加新的原型。有什么方法可以让这个函数本身保持内联呢?我有100多个函数需要像这样转换,并且担心名称冲突。@cmdv现在不是都在原型上定义了吗?