我有一个像这样的数组
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解决方案。感谢
答案 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))