将Javascript数组元素拆分为指定索引的块

时间:2017-10-30 23:50:15

标签: javascript arrays split

我有一个像这样的数组

const arr = [3,6,9,12,18,21,24,27,33,36];

我希望数组 arr 在12,21和33分割成块。这是在索引3,5和8.我想生成另一个数组看起来像这样......

const chunks = [[3,6,9,12],[18,21],[24,27,33],[36]];

我在这里看到的解决方案基本上将数组拆分为'n'块。基本上我想在几个(指定)索引处拆分数组。

我不介意使用underscore.js / lodash解决方案。感谢

4 个答案:

答案 0 :(得分:4)

您可以使用reduceRight并决定要拆分的元素。由于您提供的是子数组的最后值,而不是第一个,因此从右到左实际上要容易一些,因此我使用了{{ 1}}而不是reduceRight

按值拆分



reduce

const arr = [3, 6, 9, 12, 18, 21, 24, 27, 33, 36],
  splitValues = [12, 21, 33],
  chunks = arr.reduceRight((result, value) => {
    result[0] = result[0] || [];

    if (splitValues.includes(value)) {
      result.unshift([value]);
    } else {
      result[0].unshift(value);
    }

    return result;
  }, []);

console.log(chunks);




按索引分割



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

const arr = [3, 6, 9, 12, 18, 21, 24, 27, 33, 36],
  splitIndexes = [3, 5, 8],
  chunks = arr.reduceRight((result, value, index) => {
    result[0] = result[0] || [];

    if (splitIndexes.includes(index)) {
      result.unshift([value]);
    } else {
      result[0].unshift(value);
    }

    return result;
  }, []);

console.log(chunks);




答案 1 :(得分:1)



const arr = [3,6,9,12,18,21,24,27,33,36];

// Important: this array gets mutated. Make a copy if that's not okay.
const inds = [3,5,8];

const chunked = arr.reduce((p, c, i) => { if (i-1 === inds[0]) { inds.shift(); p.push([]); } p[p.length-1].push(c); return p; }, [[]]);

console.log(chunked)




答案 2 :(得分:1)

这是另一种做法,我觉得有点清楚。

function chunkIt(arr, indexes) {
    const ret = [];
    let last = 0;

    indexes.forEach(i => {
        ret.push(arr.slice(last, i + 1));
        last = i + 1;
    });
    if (last < arr.length) {
        ret.push(arr.slice(last));
    }
    return ret;
}

console.log(chunkIt([3,6,9,12,18,21,24,27,33,36], [3,5,8]));

答案 3 :(得分:0)

带有反向索引的“简化”版本,但splice修改了源数组:

arr = [3, 6, 9, 12, 18, 21, 24, 27, 33, 36]

chunks = [9, 6, 4, 0].map(i => arr.splice(i)).reverse()

console.log(JSON.stringify(chunks))

可以使用

slice来保留源数组:

arr = [3, 6, 9, 12, 18, 21, 24, 27, 33, 36], indexes = [0, 4, 6, 9]

chunks = indexes.map((e, i) => arr.slice(e, indexes[i + 1]))

console.log(JSON.stringify(chunks))