2017-06-14 65 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()); 
相關問題