更改 ramda.js 中对象列表中的道具
change a prop in list of object in ramda.js
我在 JSON 中有一个对象数组,想更改一个值的属性。
例如,假设我有一个唯一的关键字段和 amount
、name
道具。
我的方法是使用 findIndex
或 map 在列表中找到一个对象,然后将其删除并创建一个新对象并推送到它。这是好方法吗?
可以推荐更好的方法或功能吗?
也许是这样的?
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
)
;
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
, we could simply fetch the value using 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.
上看到实际效果
我在 JSON 中有一个对象数组,想更改一个值的属性。
例如,假设我有一个唯一的关键字段和 amount
、name
道具。
我的方法是使用 findIndex
或 map 在列表中找到一个对象,然后将其删除并创建一个新对象并推送到它。这是好方法吗?
可以推荐更好的方法或功能吗?
也许是这样的?
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
)
;
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
, we could simply fetch the value using 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.
上看到实际效果