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,但找不到:)