如何提取数组中customFields内required=true的对象?求forEach以外的方法
提取customFields中required为true的对象(一维数组结果)
你当前用map+filter得到嵌套数组,是因为map会为每个原数组元素返回一个数组,最终形成二维数组。下面是几种能直接得到一维结果的方法:
方法1:使用flatMap(最简洁)
flatMap相当于先执行map,再对结果执行flat(1),正好能把嵌套的数组扁平化一层,完美匹配你的需求:
const arr = [ { customFields: [{ id: 0, required: true }, { id: 1, required: false }] }, { customFields: [{ id: 2, required: false }, { id: 3, required: false }] }, { customFields: [{ id: 4, required: false }, { id: 5, required: true }] }, ] const requireds = arr.flatMap(x => x.customFields.filter(y => y.required)) console.log(requireds) // 输出:[{ id: 0, required: true }, { id: 5, required: true }]
方法2:使用reduce
通过reduce来累加符合条件的元素,每次把当前项的过滤结果合并到累加器里:
const requireds = arr.reduce((acc, curr) => { // 把当前customFields中符合条件的元素添加到累加器 acc.push(...curr.customFields.filter(y => y.required)) return acc }, []) // 或者用concat写法更简洁: // const requireds = arr.reduce((acc, curr) => acc.concat(curr.customFields.filter(y => y.required)), [])
方法3:先map+filter再扁平化
如果你想保留原来的map+filter逻辑,只需要在最后把二维数组扁平化即可,有两种方式:
- 使用数组的
flat()方法:
const requireds = arr.map(x => x.customFields.filter(y => y.required)).flat()
- 使用扩展运算符结合
concat:
const requireds = [].concat(...arr.map(x => x.customFields.filter(y => y.required)))
这些方法都能替代forEach循环,得到你想要的一维数组结果。
内容的提问来源于stack exchange,提问作者sonEtLumiere
相关产品推荐
相关产品推荐

