2016-06-28 27 views

回答

6

Immutable.js不提供正確的開箱。

以下是將列表拆分爲相同大小的塊的功能。如果列表不能均勻分割,最後的塊可能會更小。

function splitIntoChunks(list, chunkSize = 1) { 
    return Immutable.Range(0, list.count(), chunkSize) 
    .map(chunkStart => list.slice(chunkStart, chunkStart + chunkSize)); 
} 

它首先枚舉,其中每個塊應該開始的索引,然後轉換的索引列表成片從各指數的指數加塊大小跨越的列表。

對我來說看起來簡單而高效。

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)) 

例子:https://jsfiddle.net/lau_chung/c67g7469/2/

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); 

我進口rangelodash/rangeListimmutable 希望這會有所幫助。

0

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模塊的作者。