Ramda.js 在拉姆达思考

Ramda.js 在拉姆达思考,ramda.js,Ramda.js,我知道Ramda有很多有用的函数,但我不知道,如何编写出比这个更好的函数。有谁能做得更好吗? 附言:请参考Ramda的思考方式 // @flow /** const state = { forms: [ {id: 'form-id'} ], inputs: [ {inputId: 'input-id', formId: 'form-id', value: ''} ] } */ import { propEq, find, upd

我知道Ramda有很多有用的函数,但我不知道,如何编写出比这个更好的函数。有谁能做得更好吗? 附言:请参考Ramda的思考方式

// @flow
/**
  const state = {
    forms: [
      {id: 'form-id'}
    ],
    inputs: [
      {inputId: 'input-id', formId: 'form-id', value: ''}
    ]
  }
*/


import { propEq, find, update, compose, assoc, assocPath, findIndex } from 'ramda';

export const setInputValueInState = (
  inputId: string,
  value: string,
  state: FormsState,
): FormsState => {
  const input = getInputById(inputId, state);
  const inputWithNewValue = assoc('value', value, input);
  const inputIndex = findIndex(propEq('inputId', inputId))(state.inputs);
  return assocPath(['inputs', inputIndex], inputWithNewValue, state);
};

你有很多方法可以做到这一点。通过巧妙地使用or,您可能可以创建现有函数的无点版本。不过,我不认为它最终会变得特别可读,所以我会考虑其他技术

一种可能性是使用
镜头。大多数关于镜头的文章都是针对哈斯克尔或其他语言的。但是我在Javascript中找到了一些,并且

Ramda有几个内置的镜头创建功能、、以及与镜头配合使用的功能,如和。但是创建自己的应用程序非常容易,比如下面的
inputIdLens

const state={
表格:[
{id:'表单id'}
],
投入:[
{inputId:'i-1',formId:'foo-12',value:'123'},
{inputId:'i-2',formId:'bar-34',value:'234'},
{inputId:'i-3',formId:'baz-56',value:'345'},
{inputId:'i-4',formId:'qux-78',value:'456'},
{inputId:'i-5',formId:'corge-90',value:'567'}
]
}
常量{lens,find,propEq,update,findIndex,set,compose,lensProp}=R
常量inputIdLens=(inputId)=>镜头(
(s) =>查找(propEq('inputId',inputId),s),
(a,s)=>更新(findIndex(propEq('inputId',inputId),s),a,s)
)
const setInputValueInState=(inputId、val、state)=>
集合(组合(lensProp('inputs')、inputIdLens(inputId)、lensProp('value')、val、state)
console.log(setInputValueInState('i-2','foobar',state))

有很多方法可以做到这一点。通过巧妙地使用or,您可能可以创建现有函数的无点版本。不过,我不认为它最终会变得特别可读,所以我会考虑其他技术

一种可能性是使用
镜头。大多数关于镜头的文章都是针对哈斯克尔或其他语言的。但是我在Javascript中找到了一些,并且

Ramda有几个内置的镜头创建功能、、以及与镜头配合使用的功能,如和。但是创建自己的应用程序非常容易,比如下面的
inputIdLens

const state={
表格:[
{id:'表单id'}
],
投入:[
{inputId:'i-1',formId:'foo-12',value:'123'},
{inputId:'i-2',formId:'bar-34',value:'234'},
{inputId:'i-3',formId:'baz-56',value:'345'},
{inputId:'i-4',formId:'qux-78',value:'456'},
{inputId:'i-5',formId:'corge-90',value:'567'}
]
}
常量{lens,find,propEq,update,findIndex,set,compose,lensProp}=R
常量inputIdLens=(inputId)=>镜头(
(s) =>查找(propEq('inputId',inputId),s),
(a,s)=>更新(findIndex(propEq('inputId',inputId),s),a,s)
)
const setInputValueInState=(inputId、val、state)=>
集合(组合(lensProp('inputs')、inputIdLens(inputId)、lensProp('value')、val、state)
console.log(setInputValueInState('i-2','foobar',state))

虽然Scott的答案更实用,但我发现这种方法更容易编写和理解。我喜欢
evolve
而不是镜头,感觉更自然

import { curry, evolve, adjust, findIndex, propEq, assoc } from 'ramda';

const state = {
  forms: [
    {id: 'form-id'}
  ],
  inputs: [
    {inputId: 'i-1', formId: 'form-1', value: '123'},
    {inputId: 'i-2', formId: 'form-2', value: '234'},
  ]
}

const setInputValueInState = curry((inputId, value, obj) => evolve({
  inputs: adjust(
    findIndex(propEq('inputId', inputId), obj.inputs), 
    assoc('value', value),
  ),
}, obj));

setInputValueInState('i-2', 'foobar', state);

虽然Scott的答案更实用,但我发现这种方法更容易编写和理解。我喜欢
evolve
而不是镜头,感觉更自然

import { curry, evolve, adjust, findIndex, propEq, assoc } from 'ramda';

const state = {
  forms: [
    {id: 'form-id'}
  ],
  inputs: [
    {inputId: 'i-1', formId: 'form-1', value: '123'},
    {inputId: 'i-2', formId: 'form-2', value: '234'},
  ]
}

const setInputValueInState = curry((inputId, value, obj) => evolve({
  inputs: adjust(
    findIndex(propEq('inputId', inputId), obj.inputs), 
    assoc('value', value),
  ),
}, obj));

setInputValueInState('i-2', 'foobar', state);