如何在Immutable accumulator中使用ImmutableJS的reduce函数?

时间:2017-06-14 00:43:35

标签: javascript immutable.js

我正在尝试使用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 个答案:

答案 0 :(得分:1)

在不可变数据中,所有数据都是“只读”,当您调用de 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());

答案 1 :(得分: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());