如何将ImmutableJS列表分成多个列表

时间:2016-06-28 16:24:20

标签: list immutable.js

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

我可以将我的列表转换为数组,然后将其传递给chunk并将响应转换回ImmutableJS列表,但我被告知浅层转换效率不高且我的列表非常大。

谢谢你, -G。

4 个答案:

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

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

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

我从rangelodash/range List导出immutable 希望这会有所帮助。