使用ramda更改数组中的对象属性

时间:2017-10-08 06:01:34

标签: 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(),
);

但是这个代码resualt是我想要的对象,只有它的'good'属性。我希望通过这种改变得到完整的阵列。

3 个答案:

答案 0 :(得分:11)

我会这样做:

const alter = curry((checked, key, items) => map(
  when(propEq('key', key), assoc('good', checked)),
  items
))

alter('true', '22', items)

这样做的好处是在原始版本中不包含任何自由变量(例如checkedname。)如果你永远不需要部分版本,那么可以放弃currying

您可以在 Ramda REPL 上看到这一点。

答案 1 :(得分:3)

我必须对所检查的值和名称做出一些假设。



let checked = 'true'
let name = '22'

let input = [{name:'name', key:'21',good: 'true'},
{name: 'another name', key:'22',good:'false'}]

const update = R.map(R.ifElse(R.propEq('key', name), R.assoc('good', checked), (item) => item))

console.log(update(input))

<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

我会使用Ramda的find,findIndex和update组合。 我们假设您的数组名称是数组,并且您想要从数组的第二个对象更改密钥。 你想改变&#39; 22&#39;到&#39; 40&#39;。

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;