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

如果我有一些(半精确的)数据,请使用函数式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: '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)