Javascript 使用ramda更改数组中的对象属性
我有一个对象数组,如下所示:Javascript 使用ramda更改数组中的对象属性,javascript,ramda.js,Javascript,Ramda.js,我有一个对象数组,如下所示: [{name:'name', key:'21',good: 'true'}, {name: 'another name', key:'22',good:'false'}, ...] 现在,我想对数组中的一个对象进行更改。我的第一次尝试是: const s = R.compose( R.assoc('good', checked), R.propEq('key', name), R.map(), ); 但是这段代码产生了我想要的对象,并且只产生了它的“
[{name:'name', key:'21',good: 'true'},
{name: 'another name', key:'22',good:'false'},
...]
现在,我想对数组中的一个对象进行更改。我的第一次尝试是:
const s = R.compose(
R.assoc('good', checked),
R.propEq('key', name),
R.map(),
);
但是这段代码产生了我想要的对象,并且只产生了它的
“good”
属性。我想用这个更改获得整个数组。我必须对检查的值和名称进行一些假设
let checked='true'
让name='22'
让输入=[{name:'name',key:'21',good:'true'},
{name:'other name',key:'22',good:'false'}]
const update=R.map(R.ifElse(R.propEq('key',name),R.assoc('good',checked),(item)=>item))
console.log(更新(输入))
我会这样做:
const alter = curry((checked, key, items) => map(
when(propEq('key', key), assoc('good', checked)),
items
))
alter('true', '22', items)
这样做的好处是不包含自由变量(如原始版本中的选中的
和名称
)
您可以在上看到这一点,我将使用Ramda的find、findIndex和update组合。 假设数组的名称为array,您希望更改数组第二个对象的键。 您想从'22'改为'40'
const objToChange = R.find(R.propEq('key', 22 ))(array); // To find the object you like to change.
objToChange.key = 40; // Change your desired field.
R.update(R.findIndex(R.propEq('key', 22))(array), objToChange,
patients); // And update the array with the new changed object.
或者只是使用findIndex
const index = R.findIndex(R.propEq('key', 22))(patients);
array[index].key = 40;
三点:(1)
(item)=>item
也可以写入R.identity
。(2) ifElse(pred,fn,identity)
在when(pred,fn)
中有一个速记。(3) 使用自由变量,如checked
和name
意味着这在引用上是不透明的,这在函数式编程中是一件坏事(TM)。如果这些参数也是函数的参数,那就更清楚了请参阅我的答案,了解修复这些问题的版本。感谢您的澄清。我是ramda的新手,有很多函数,我知道应该有(item)=>item,但找不到:)