如果我们在数组上使用map
-我们将获得相同数量的元素。
如果我们想要更少的元素-我们可以根据情况使用filter
,find
或reduce
。
是否有一个内置功能可以以其他方式工作?
例如,假设我有一个像这样的数组:
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
并将项目推入新数组来实现这一点,但是它有一些现成的功能吗?
答案 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)
map
,filter
和find
回调仅返回布尔值,并且方法本身决定最终返回什么。使用reduce
,您的回调函数可以返回任何内容,而这恰好是reduce
的返回值。所以:
console.log(['foo', 'bar', 'baz'].reduce((a, i) => [...a, ...a, i], []))
reduce
的示例产生的元素多于其输入。