是否有一个数组函数产生的元素多于接收的元素?

时间:2019-05-27 09:24:14

标签: javascript arrays

如果我们在数组上使用map-我们将获得相同数量的元素。

如果我们想要更少的元素-我们可以根据情况使用filterfindreduce

是否有一个内置功能可以以其他方式工作?

例如,假设我有一个像这样的数组:

myArray = [
  {nodes: Array(5)}, // some array with 5 elements
  {nodes: Array(3)},
  {nodes: Array(3)}
]

我想将具有3个以上元素的每个数组拆分为最多3个元素的数组。所以最后我想得到:

splittedArray = [
  {nodes: Array(3)},
  {nodes: Array(2)},
  {nodes: Array(3)},
  {nodes: Array(3)}
]

我知道如何通过用myArray循环forEach并将项目推入新数组来实现这一点,但是它有一些现成的功能吗?

3 个答案:

答案 0 :(得分:3)

使用Array.flatMap()迭代原始数组,使用chunks方法(基于Array.from())将nodes数组拆分为多个数组,然后将它们映射,并将它们包装在一个对象中。 flatMap将结果转换回单个数组。

const myArray = [
  {nodes: Array(5)},
  {nodes: Array(3)},
  {nodes: Array(3)}
]

const chunks = chunkSize => arr => Array.from({ length: Math.ceil(arr.length / chunkSize) }, (_, i) =>
  arr.slice(i * chunkSize, (i + 1) * chunkSize)
)

const chunks3 = chunks(3)

const result = myArray.flatMap(o => chunks3(o.nodes).map(nodes => ({ nodes })))

console.log(result)

答案 1 :(得分:2)

  

但是有一些现成的功能吗?

不幸的是没有。其他语言(例如,科特林)也有chunk方法。

然而,可以使用.flatMap来实现,但是“循环良好”在这里效果更好:

 const result = [], size = 3;

 for(const { nodes } of myArray) {
    for(let i = 0; i < nodes.length; i += size)   
      result.push({ nodes: nodes.slice(i, i + size) });
 }

答案 2 :(得分:1)

mapfilterfind回调仅返回布尔值,并且方法本身决定最终返回什么。使用reduce,您的回调函数可以返回任何内容,而这恰好是reduce的返回值。所以:

console.log(['foo', 'bar', 'baz'].reduce((a, i) => [...a, ...a, i], []))

reduce的示例产生的元素多于其输入。