有沒有辦法將ImmutableJS列表分成多列表列表?我基本上尋找像lodash's chunk但ImmutableJS列表。如何將ImmutableJS列表分塊爲多個列表
我可以將我的列表轉換爲數組,然後將其傳遞給chunk並將響應轉換回ImmutableJS列表,但我被告知淺轉換效率不高,我的列表非常大。
謝謝 G.
有沒有辦法將ImmutableJS列表分成多列表列表?我基本上尋找像lodash's chunk但ImmutableJS列表。如何將ImmutableJS列表分塊爲多個列表
我可以將我的列表轉換爲數組,然後將其傳遞給chunk並將響應轉換回ImmutableJS列表,但我被告知淺轉換效率不高,我的列表非常大。
謝謝 G.
Immutable.js不提供正確的開箱。
以下是將列表拆分爲相同大小的塊的功能。如果列表不能均勻分割,最後的塊可能會更小。
function splitIntoChunks(list, chunkSize = 1) {
return Immutable.Range(0, list.count(), chunkSize)
.map(chunkStart => list.slice(chunkStart, chunkStart + chunkSize));
}
它首先枚舉,其中每個塊應該開始的索引,然後轉換的索引列表成片從各指數的指數加塊大小跨越的列表。
對我來說看起來簡單而高效。
從這個線程這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))
我剛剛遇到這個問題也和我寫這個功能解決了這個問題:
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
希望這會有所幫助。
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模塊的作者。