2017-10-10 64 views
0

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

+0

你为什么要删除对象然后再添加它?只需更改对象? –

+0

@AnteJablanAdamović:函数式编程的一个主要主题是避免变异数据。 –

回答

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

也许这样的事情?

var org = 
    [ 
    {name:"one",age:1} 
    ,{name:"two",age:2} 
    ] 
; 
var newArray = 
    org 
    .map(
    (x,index)=> 
     index === 1 
     ?Object.assign(
     {} 
     ,x 
     ,{name:"new name"} 
    ) 
     :x 
) 
;