Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.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 我是否使用了错误的Ramda函数,R.reduce不';他似乎不在工作_Javascript_Functional Programming_Ramda.js - Fatal编程技术网

Javascript 我是否使用了错误的Ramda函数,R.reduce不';他似乎不在工作

Javascript 我是否使用了错误的Ramda函数,R.reduce不';他似乎不在工作,javascript,functional-programming,ramda.js,Javascript,Functional Programming,Ramda.js,给定一个初始消息字符串(实际上就像一个格式字符串),并包含随后要填充的占位符 例如,我们最初的信息是: “问候-{年}-{月}-{日}-你好,世界” 如果有3个席位持有者,{year},{mm month},{dd day} 我想将此转化为: “问候语-2016-06-23-你好世界” 假设我们有一个对象数组,如下所示: [{ "Key": "{year}", "Value": "2016" }, { "Key": "{mm-month}", "Value": "06" }, {

给定一个初始消息字符串(实际上就像一个格式字符串),并包含随后要填充的占位符

例如,我们最初的信息是:

“问候-{年}-{月}-{日}-你好,世界”

如果有3个席位持有者,{year}{mm month}{dd day}

我想将此转化为:

“问候语-2016-06-23-你好世界”

假设我们有一个对象数组,如下所示:

[{
  "Key": "{year}",
  "Value": "2016"
}, {
  "Key": "{mm-month}",
  "Value": "06"
}, {
  "Key": "{dd-day}",
  "Value": "23"
}]
每个对象都有一个与消息中的占位符字符串对应的键,以及用于替换占位符的值

我使用的是R.reduce函数,因为我们有一个值集合(具有键值属性的对象列表)、一个字符串替换转换函数(tr),初始累加器是原始的占位符字符串

转换函数tr定义为:

设tr=(k,v)=>{return{Key:k,Value:v}

执行文本替换的rp功能定义为:

让rp=(pair,msg)=>{返回R.replace(pair.Key,pair.Value,msg);}

因此,理想的效果是迭代列表,用字段值替换字段名,在每次迭代中,返回部分流行的字符串,直到最后有一个完全填充的字符串,没有剩余的占位符

我将我的解决方案建模为使用R.reduce和R.add ie:

R.reduce(R.add,0,[1,2,3,4,5])

在我看来,这似乎符合同样的模式,除非我搞错了

这是对R.reduce的调用,它不能按预期工作:

右减径管(rp、定位支架、成对)


我在Ramda repl中创建了一个代码片段:

非常接近,您只是在reducer函数中转置了两个参数。而不是这个:

let rp = (pair, msg) => { return R.replace(pair.Key, pair.Value, msg); }
这样做:

let rp = (msg, pair) => { return R.replace(pair.Key, pair.Value, msg); }
const place_holders=“问候语-{year}-{mm month}-{dd day}-你好世界”;
让字段=['{year}','{mm month}','{dd day}'];
设VAL=['2016','06','23'];
设tr=(k,v)=>{return{Key:k,Value:v}
设pairs=R.zipWith(tr,fields,vals);
让rp=(msg,pair)=>{返回R.replace(pair.Key,pair.Value,msg);}
console.log(R.reduce(rp,place_支架,成对))

非常接近,您只是在reducer函数中转置了两个参数。而不是:

let rp = (pair, msg) => { return R.replace(pair.Key, pair.Value, msg); }
这样做:

let rp = (msg, pair) => { return R.replace(pair.Key, pair.Value, msg); }
const place_holders=“问候语-{year}-{mm month}-{dd day}-你好世界”;
让字段=['{year}','{mm month}','{dd day}'];
设VAL=['2016','06','23'];
设tr=(k,v)=>{return{Key:k,Value:v}
设pairs=R.zipWith(tr,fields,vals);
让rp=(msg,pair)=>{返回R.replace(pair.Key,pair.Value,msg);}
console.log(R.reduce(rp,place_支架,成对))

正如Nicholas Tower指出的,这个错误是一个简单的换位。我的版本是将命令式代码封装在函数中,所以我可能会这样写:

const fillIn=(字段、占位符、VAL)=>reduce(
(str,{Key,Val})=>替换(Key,Val,str),
持票人,
zipWith((Key,Val)=>({Key,Val}),字段,Val)
)
const place_holders=“问候-{year}-{mm month}-{dd day}-你好世界”;
让字段=['{year}','{mm month}','{dd day}'];
设VAL=['2016','06','23'];
console.log(填写(字段、占位符、VAL))

常数{reduce,replace,zipWith}=R

正如Nicholas Tower指出的,这个错误是一个简单的换位。我的版本是将命令式代码包装到函数中,因此我可能会编写如下内容:

const fillIn=(字段、占位符、VAL)=>reduce(
(str,{Key,Val})=>替换(Key,Val,str),
持票人,
zipWith((Key,Val)=>({Key,Val}),字段,Val)
)
const place_holders=“问候-{year}-{mm month}-{dd day}-你好世界”;
让字段=['{year}','{mm month}','{dd day}'];
设VAL=['2016','06','23'];
console.log(填写(字段、占位符、VAL))

常数{reduce,replace,zipWith}=R

Argh哇,谢谢。我如何避免将来发生这种类型的错误?R.reduce向函数传递参数的方式一定有关系,但我看不出这与本机
reduce
向回调函数传递参数的顺序相同:首先是累加器,然后是当前值。(本机参数还传递Ramda选择不提供的其他参数。)传递给reducer的第一个值是累加器。即,您正在构建的值。第二个值是我们要合并到累加器中的数组的当前元素。ramda文档提到了这一点,并且它的顺序与array.reduce使用的顺序相同(尽管array.reduce也传递了一些额外的参数)注意,在函数中,
(foo)=>{return expression}
可以更简单地写成
(foo)=>expression
。这只在括号中有一个表达式的情况下有效,但这是一个很好的清理。哇,谢谢。我如何避免将来出现这种类型的错误?R.reduce向函数传递参数的方式一定有关系,但我看不出这与本机
的顺序相同>reduce
首先向其回调函数传递参数:累加器,然后是当前值。(本机函数还传递Ramda选择不提供的其他参数。)传递给reducer的第一个值是累加器。即,您正在构建的值。第二个值是我们要合并到累加器中的数组的当前元素。ramda文档提到了这一点,并且它的顺序与array.reduce使用的顺序相同(尽管array.reduce也传递了一些额外的参数)请注意,在函数中,
(foo)=>{return expression}
可以更简单地写成
(foo)=>expressio