如何根据特定的数组组合对数组进行分区?

时间:2019-05-22 13:14:41

标签: javascript arrays chunks

我有一个数组,想根据给定的值组合将它们划分为大块。

例如,我有一个数组,其中仅包含两个不同的值,即Portrait和Landscape。

['Landscape', 'Landscape', 'Portrait', 'Portrait', 'Landscape', 'Portrait']

我希望将其划分的条件是

  • 缩小的数组大小<= 3。
  • 大块只能具有“风景” <= 2。
  • “风景”和“肖像”不能在同一块中。

因此,我希望输出如下:

[['Landscape', 'Landscape'], ['Portrait', 'Portrait'],['Landscape'], ['Portrait']

1 个答案:

答案 0 :(得分:1)

您可以收集数组中新块的约束,并检查约束之一是否为true,然后将新块添加到结果集中。

var array = ['Landscape', 'Landscape', 'Portrait', 'Portrait', 'Landscape', 'Portrait'],
    constraints = [
        (chunk, v) => v !== chunk[0],
        (chunk, v) => v === 'Landscape' && chunk.length === 2,
        chunk => chunk.length === 3
    ],
    chunks = array.reduce((r, v) => {
        var last = r[r.length - 1];
        if (!last || constraints.some(fn => fn(last, v))) r.push(last = []);
        last.push(v);
        return r;    
    }, []);

console.log(chunks);
.as-console-wrapper { max-height: 100% !important; top: 0; }