我想像下面这样转换一个数组:
const myArray = [ 'a', 'b', 'c', 'd', 'e', 'f' ];
像这样:
const transformedArray = [ [ 'a', 'b' ], [ 'c', 'd' ], [ 'e', 'f' ] ];
我看到的唯一方法是使用一个很好的for循环来执行此操作,但是是否有一种更优雅的方法可以使用Array.prototype
函数来执行此操作?
答案 0 :(得分:5)
您可以使用reduce
,Math.floor
和%
const myArray = ['a', 'b', 'c', 'd', 'e', 'f']
const newArray = myArray.reduce((acc, a, i) => {
const index = Math.floor(i/2);
acc[index] = acc[index] || [];
acc[index][i % 2] = a
return acc
}, [])
console.log(newArray)
Math.floor(i/2)
获取该项目属于哪个内部数组i % 2
获取该项目属于内部数组的哪个位置答案 1 :(得分:5)
您可以使用Array.from()
创建大块数组:
const myArray = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g' ];
const chunk = n => arr =>
Array.from({ length: Math.ceil(arr.length / n) }, (_, i) =>
myArray.slice(i * n, (i + 1) * n)
);
const log = arr => console.log(JSON.stringify(arr));
log(chunk(2)(myArray)); // [["a","b"],["c","d"],["e","f"],["g"]]
log(chunk(3)(myArray)); // [["a","b","c"],["d","e","f"],["g"]]
答案 2 :(得分:1)
下面的解决方案使用reduce
遍历数组中的项目。我们对项目的索引进行取模检查,以确定是否需要启动一个新数组。
该代码在检查不需要形成新数组的索引时会添加一个对象。我们稍后filter
将这些对象清除掉。也许有一种更优雅的方法,但是我觉得效果很好。
const letters = [ 'a', 'b', 'c', 'd', 'e', 'f' ];
const splitIntoChunks = (arrayIn, size) => arrayIn.reduce(
(prev, curr, i) => [
...prev,
i % size === 0
? arrayIn.slice(i, i + size)
: { '__remove': true }
],
[],
).filter(x => !x['__remove'])
const result = splitIntoChunks(letters, 2)
console.dir(result)
答案 3 :(得分:0)
我觉得最容易理解的另一种解决方案。
const myArray = [ 'a', 'b', 'c', 'd', 'e', 'f' ];
const transformedArray = Array(myArray.length / 2).fill().map((_, i) => [myArray[i * 2], myArray[i * 2 + 1]]);
console.log(transformedArray);