与ramda.js的代码有什么区别?

时间:2017-02-19 03:35:36

标签: javascript arrays functional-programming ramda.js

我最近尝试学习fp并尝试将ramda.js用于我的项目,但我遇到了一些问题。

我的代码的目标是我想将result prop添加一些初始值到list数组的每个元素中,但它没有按预期工作。

这是我的代码:

var list = [{name: 'foo'}, {name: 'bar'}, {name: 'baz'}]
var list1 = R.clone(list)

var getResultList = R.times(R.identity)

// what's the difference between them ??
// it worked as expected if I wrap assoc fn into arrow function and transfer it to fn
var mapAssocResult= R.map(e=> R.assoc('result', getResultList(2), e))
// it didn't work as expected if I just transfer it as param of map fn
var mapAssocResult1= R.map(R.assoc('result', getResultList(2)))

list = mapAssocResult(list)
list1 = mapAssocResult1(list1)

list[0].result === list[1].result //false
list1[0].result === list1[1].result // true
// it seems that all result props point to the same array reference, but why?

我需要注意使用Ramda.js吗?

也许我在使用Ramda.js时的想法是完全错误的,那么在Ramda.js中有更合理的方法来实现我的目标吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

您看到的结果是由getResultList(2)过早评估R.map(R.assoc('result', getResultList(2)))造成的。这最终等同于R.map(R.assoc('result', [0, 1])),它会为每个元素的[0, 1]属性分配相同的result实例。

额外箭头函数阻止对getResultList(2)进行求值,直到将映射函数应用于数组的每个元素,从而为每个[0, 1]属性生成一个新的唯一result实例