如何使用ImmutableJS的reduce函数和Immutable累加器?

3
我正在尝试使用ImmutableJS的reduce函数,代码如下:
const myChanges = data
  .getIn(['a', 'b']) // Immutable.List
  .reduce((accum, data) => {
    // console.log('accum', accum);
    // console.log('data', data); <--- an Immutable.Map
    accum.push(List([ data.get('id'), data.get('time') ]));
    return accum;
  }, List());

然而,accum 总是作为空的 Immutable.List 打印在控制台。我猜这是因为 List() 不能被改变,所以每次 accum 返回一个新的空的 Immutable.List()。
我想要得到的是一个列表,其中包含每个内部列表(本质上是一个元组)由 idtime 组成。
如何让它工作?我需要使用 withMutations 吗?
2个回答

5

在不可变性中,所有数据都是只读的。当您调用push方法时,它会返回一个新对象以进行更改。 为使此代码起作用,您需要直接返回:

const myChanges = data.getIn(['a', 'b'])
    .reduce((accum, data) => {
        return accum.push(List([ data.get('id'), data.get('time') ]));
    }, List());

或者你可以将结果存储在一个变量中并返回它。
const myChanges = data.getIn(['a', 'b'])
    .reduce((accum, data) => {
        let result = accum.push(List([ data.get('id'), data.get('time') ]));
        return result;
    }, List());

0
你的问题在于你返回了原始的accum,而不是包含数据的新值。记住push返回一个新列表,不像可变的JS Array
const myChanges = data
  .getIn(['a', 'b'])
  .reduce((accum, d) => {
    return accum.push(List([ d.get('id'), d.get('time') ]));
  }, List());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接