在arr中为objs添加id:s。 R.assoc('id',i ++)没有递增i

时间:2017-12-14 14:08:24

标签: javascript ramda.js

我正在尝试使用Ramda将id:s添加到数组中的对象,但每个对象的id等于 1

let i = 1;

return R.evolve({
    cms: {
        components: R.map(R.assoc('id', i++)),
    },
}, state),

我认为这与 i ++ 有关。一个人不应该像Ramda那样变异。

但是,我怎么能正确地做到这一点。

2 个答案:

答案 0 :(得分:1)

您必须将其包装在一个函数中,否则i++将被评估一次,然后应用于您的所有元素。

const state = {
  cms: {
    components: [{
      name: 'Serge'
    }, {
      name: 'Odile'
    }, {
      name: 'Simon'
    }, {
      name: 'Émile'
    }]
  }
};

let i = 1,
    modifiedState = R.evolve({
      cms: {
        components: R.map((element) => R.assoc('id', i++, element)),
      },
    }, state);

console.log(modifiedState.cms.components);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>

答案 1 :(得分:1)

或者你可以像这样使用Ramda的addIndex

const transform = R.evolve({
  cms: {
    components: R.addIndex(R.map)((comp, i) => R.assoc('id', i + 1, comp)),
  },
})

const state = {
  cms: {
    components: [
      {name: 'Serge'}, 
      {name: 'Odile'},
      {name: 'Simon'}, 
      {name: 'Émile'}
    ]
  }
};

console.log(transform(state))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>