2017-06-14 66 views
0

我试图使用ImmutableJS的减少,像这样的功能:如何使用Immutable累加器的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吗?

回答

1

在一成不变的所有数据都是“只读”,当你调用去推方法返回与变化新对象。 对于这个代码的工作,你需要直接返回:

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()); 
相关问题