2017-02-19 19 views
1

Я пытаюсь изучить fp недавно и попытаться использовать ramda.js в свой проект, но я встретил некоторые проблемы.Какая разница в кодах с 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?

спасибо большое.

+0

У меня нет никаких реальных предложений за пределами Скотта Кристофера ниже, но я хотел бы отметить, что 'R.range (0)', вероятно, более описательный и, конечно, более краткий, чем 'R.times (R.identity)'. –

+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 собственности.

+0

Большое спасибо, кстати, так есть ли более разумный способ достичь моей цели в Ramda.js? потому что я замечаю примеры статей о ramda.js, которые всегда используют точечный стиль для достижения чего-то. –

+0

Points-free - хороший инструмент, который может помочь сделать определенный код более удобочитаемым. Но не делайте фетиш этого. Если бы мы придумали бесплатную версию этой версии, это, вероятно, стало бы намного * менее читаемым. Так что здесь это не стоит. –

 Смежные вопросы

  • Нет связанных вопросов^_^