Javascript 如何在不使用变量的情况下修改数据子集
如果我有一些(半精确的)数据,请使用函数式Javascript,例如:Javascript 如何在不使用变量的情况下修改数据子集,javascript,functional-programming,underscore.js,lodash,ramda.js,Javascript,Functional Programming,Underscore.js,Lodash,Ramda.js,如果我有一些(半精确的)数据,请使用函数式Javascript,例如: var data = { people: [ {name: 'Vishwanathan Anand', age: 46}, {name: 'Garry Kasparov', age: 52}, {name: 'Magnus Carlsen', age: 25}, ], computers: [ {name: 'Deep Blue', age: 26}, {name: 'De
var data = {
people: [
{name: 'Vishwanathan Anand', age: 46},
{name: 'Garry Kasparov', age: 52},
{name: 'Magnus Carlsen', age: 25},
],
computers: [
{name: 'Deep Blue', age: 26},
{name: 'Deep Fritz', age: 21},
{name: 'Deep Thought', age: 28},
]
}
我希望将其转换为
var data = {
people: [
{name: 'Vishwanathan Anand', age: 46, rank: 0},
{name: 'Garry Kasparov', age: 52, rank: 1},
{name: 'Magnus Carlsen', age: 25, rank 2},
],
computers: [
{name: 'Deep Blue', age: 26},
{name: 'Deep Fritz', age: 21},
{name: 'Deep Thought', age: 28},
]
}
请注意,只有人员
获得了排名
我知道我可以
_.extend({
computers: _.map(data.people, (p, i) => {
p.rank = i;
return p;
})}, {
computers: data.computers
})
但是如果我不需要使用任何变量(不再访问数据
!)而需要使用下划线的链
,该怎么办
差不多
_.chain(data).subset('people').map((p, i) => {
p.rank = i;
return p;
})
注意这是一个真正的问题,不是一个方便的问题。我正在从事一个项目,该项目涉及为函数运算符创建一种环境,并且不允许使用变量
似乎下划线等在整个结构(数组/列表)上运行。我有没有办法让它在保留其余部分的同时在底座上操作?这个解决方案有点令人不快,但它适用于这种情况
_.chain(data)
.mapObject((value, key) => {
if (key==='people') {
return value.map((p,i) => _.extend(p, {rank: i}));
} else {
return value;
}
})
.value();
使用Ramda,您可以创建一个函数,该函数接受一个键和一个回调(cb
),并将键的项映射到所需的形式:
const{evolve,addIndex,map}=R
常量映射部分=(cb,键)=>evolve({
[关键字]:addIndex(地图)(cb)
})
康斯特数据={“人”:[{“姓名”:“维什瓦纳森·阿南德”,“年龄”:46},{“姓名”:“加里·卡斯帕罗夫”,“年龄”:52},{“姓名”:“马格纳斯·卡尔森”,“年龄”:25}],“计算机”:[{“姓名”:“深蓝色”,“年龄”:26},{“姓名”:“深弗里茨”,“年龄”:21},{“姓名”:“深思考”,“年龄”:28}
const result=mapPart((o,rank)=>({…o,rank}),'people')(数据)
console.log(结果)
每个(data.people,(p,i)=>{p.rank=i})如何。但这是变异,这在函数式编程中是非常非常邪恶的;)@托马斯:没错!该函数不再是纯函数。对于更复杂的示例,如果没有每一个,我们如何做到这一点?“不允许使用变量”并没有多大意义。如果没有变量,你甚至不能使用函数,如果没有函数,你什么都做不了。我想你要找的是镜头。我猜它会像propertyLens(“人”)(ps=>ps.map((p,I)=>(p.rank=I,p)))(data)