有没有办法将ImmutableJS列表分成多个列表的列表?我基本上都在寻找像lodash's chunk这样的东西,但是对于ImmutableJS列表。
我可以将我的列表转换为数组,然后将其传递给chunk并将响应转换回ImmutableJS列表,但我被告知浅层转换效率不高且我的列表非常大。
谢谢你, -G。
答案 0 :(得分:10)
Immutable.js不提供开箱即用的功能。
这是将列表拆分为相同大小的块的功能。如果列表无法均匀分割,则最后一个块可能会更小。
function splitIntoChunks(list, chunkSize = 1) {
return Immutable.Range(0, list.count(), chunkSize)
.map(chunkStart => list.slice(chunkStart, chunkStart + chunkSize));
}
它首先枚举每个块应该开始的索引,然后将索引列表转换为从每个索引到索引加上块大小的切片列表。
对我来说看起来简单而有效。
答案 1 :(得分:1)
mudash(提供不可变js支持的lodash包装器)提供chunk method。它应该给你你需要的东西。没有进行任何转换,因此性能仍然很高。
import _ from 'mudash'
import Immutable from 'immutable'
const list = Immutable.List([1, 2, 3, 4])
_.chunk(list, 2) // List [ List [ 1, 2 ], List [ 3, 4 ] ]
完全披露,我是mudash模块的作者。
答案 2 :(得分:0)
此线程中的此chunk函数似乎与我的不可变数据开箱即用。
function chunk(chunkSize, array) {
return array.reduce(function(previous, current) {
var chunk;
if (previous.length === 0 ||
previous[previous.length -1].length === chunkSize) {
chunk = []; // 1
previous.push(chunk); // 2
}
else {
chunk = previous[previous.length -1]; // 3
}
chunk.push(current); // 4
return previous; // 5
}, []); // 6
}
var list = Immutable.fromJS(['something','nothing','anything','hello'])
console.log(chunk(3,list))
答案 3 :(得分:0)
我也遇到过这个问题,我通过写这个函数解决了这个问题:
const getListAsChunks = (list, chunkSize) => {
const iterations = Math.ceil(list.count() / chunkSize);
return range(0, iterations).reduce((all, item, i) => {
const start = i * chunkSize;
const end = (i + 1) * chunkSize;
return all.push(list.slice(start, end));
}, List());
};
然后这样称呼它:
const myChunkedList = getListAsChunks(myImmutableList, 5);
我从range
和lodash/range
List
导出immutable
希望这会有所帮助。