首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在不使用变量的情况下修改数据子集

如何在不使用变量的情况下修改数据子集
EN

Stack Overflow用户
提问于 2016-05-20 19:13:17
回答 2查看 75关注 0票数 2

使用像UnderscoreLodhashRamdaImmutable JS这样的函数式Javascript,如果我有一些(半准确的)数据如下:

代码语言: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},
  ]
}

我希望将它转换为

代码语言:javascript
复制
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},
  ]
}

请注意,只有people子结构获得了rank

我知道我可以

代码语言:javascript
复制
_.extend({
  computers: _.map(data.people, (p, i) => {
    p.rank = i;
    return p;
  })}, {
    computers: data.computers
  })

但是,如果我不需要使用任何变量(不再访问data!)使用下划线的chain

就像这样

代码语言:javascript
复制
_.chain(data).subset('people').map((p, i) => {
  p.rank = i;
  return p;
})

注意到,这是一个真正的问题,而不是方便的问题。我正在做一个项目,它涉及到为函数运算符和变量创建一种环境,是不允许的。

它似乎下划线之类的操作在整个列表结构(数组/列表)上进行。有没有什么方法可以让它在操作一个子结构的同时保留其余的部分?

EN

回答 2

Stack Overflow用户

发布于 2016-05-20 22:25:22

这个解决方案有点令人不快,但它在这种情况下是有效的。

代码语言:javascript
复制
_.chain(data)
    .mapObject((value, key) => {
        if (key==='people') {
            return value.map((p,i) => _.extend(p, {rank: i}));
        } else {
            return value;
        }
    })
    .value();
票数 0
EN

Stack Overflow用户

发布于 2019-05-31 03:20:06

使用Ramda,您可以使用R.evolve创建一个函数,该函数接受一个键和一个回调(cb),并将键的项映射到所需的形式:

代码语言:javascript
复制
const { evolve, addIndex, map } = R

const mapPart = (cb, key) => evolve({
  [key]: addIndex(map)(cb)
})

const 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}]}

const result = mapPart((o, rank) => ({ ...o, rank }), 'people')(data)

console.log(result)
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37345226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档