Ramda.js 在拉姆达思考
我知道Ramda有很多有用的函数,但我不知道,如何编写出比这个更好的函数。有谁能做得更好吗? 附言:请参考Ramda的思考方式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
// @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);