从一个数组到另一个数组

时间:2019-02-04 08:57:18

标签: javascript arrays

我想像下面这样转换一个数组:

const myArray = [ 'a', 'b', 'c', 'd', 'e', 'f' ];

像这样:

const transformedArray = [ [ 'a', 'b' ], [ 'c', 'd' ], [ 'e', 'f' ] ];

我看到的唯一方法是使用一个很好的for循环来执行此操作,但是是否有一种更优雅的方法可以使用Array.prototype函数来执行此操作?

4 个答案:

答案 0 :(得分:5)

您可以使用reduceMath.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);