我正在尝试使用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()。
我想得到的是一个列表列表,其中每个内部列表(基本上是一个元组)由id
和time
组成。
我怎样才能让它发挥作用?我需要使用withMutations
吗?
答案 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());