如何将 ImmutableJS 列表分块为多个列表

How to chunk ImmutableJS list into multiple lists

有没有办法将一个 ImmutableJS 列表分成多个列表的列表?我基本上是在寻找类似 lodash's chunk 的东西,但对于 ImmutableJS 列表。

我可以在将列表传递给 chunk 之前将其转换为数组并将响应转换回 ImmutableJS 列表,但有人告诉我浅表转换效率不高,而且我的列表非常大。

谢谢, G.

这个线程中的 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/

Immutable.js 没有开箱即用。

这是将列表拆分为大小相等的块的函数。如果列表不能平均分割,最后一个块可能会更小。

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

它首先枚举每个块应该开始的索引,然后将索引列表转换为从每个索引到索引加上块大小的切片列表。

在我看来简单高效。

我也刚遇到这个问题,我写了这个函数解决了它:

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

我从 lodash/range 导入了 range,从 immutable 导入了 List 希望这有帮助。

mudash (a lodash wrapper that provides immutable js support) provides a 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 模块的作者。