在ramda.js中更改对象列表中的prop

时间:2017-10-10 13:29:42

标签: javascript ramda.js

我在JSON中有一个对象数组,想要更改一个值的属性。 例如,假设我有一个唯一的关键字段和amountname道具。 我的方法是使用findIndex或map找到列表中的对象,然后删除它并创建一个新对象并推送到它。这是好方法吗? 可以推荐更好的方法或功能吗?

2 个答案:

答案 0 :(得分:2)

Lenses可能是解决这个问题的规范方法,尽管Ramda有很多选择。

const people = [
  {id: 1, name: 'fred', age: 28},
  {id: 2, name: 'wilma', age: 25},
  {id: 3, name: 'barney', age: 27},
  {id: 4, name: 'betty', age: 29},  
]

const personIdx = name => findIndex(propEq('name', name), people)
const ageLens = idx => lensPath([idx, 'age'])

const wLens = ageLens(personIdx('wilma'))

const newPeople = over(wLens, age => age + 1, people)
//=> [
//     {id: 1, name: 'fred', age: 28},
//     {id: 2, name: 'wilma', age: 26},
//     {id: 3, name: 'barney', age: 27},
//     {id: 4, name: 'betty', age: 29},  
//   ]

请注意,虽然newPeople是一个全新的对象,但它与现有的people共享尽可能多的内容。例如,newPeople[3] === people[3] //=> true

另请注意,除了使用over使用此镜头调整参数外,我们只需使用view获取值:

view(wLens, people) //=> 25

或者我们可以使用set将其设置为固定值:

set(wLens, 42, people) //=> new version of `people` with wilma's age at 42

最后,请注意镜片组成。我们本可以写下这个:

const ageLens = idx => compose(lensIndex(idx), lensProp('age')).

镜头构成非常强大。

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

答案 1 :(得分:1)

这样的事可能吗?

A,B,C1,D1
A,B,C1,D2
A,B,C2,D3
A,B,C2,D4