- 在解决数据的时候,常常须要对数据进行过滤和遍历,以便把数据转换成合乎咱们要求的格局,比方上面的场景:
过滤掉名字为空的数据,如果年龄小于 18,设置 disabled: true
,大于等于 18,设置 disabled: false
// 原始数据
[{name: '小明', age: 15}, {name: '张三', age: 18}, {name: '李四', age: 20}, {name: '', age: 30}]
// 转换后数据
[{name: '小明', age: 15, disabled: true}, {name: '张三', age: 18, disabled: false}, {name: '李四', age: 20, disabled: false}]
- 对于大多数开发者来说,首先能想到的办法应该是 filter 和 map。
[{name: '小明', age: 15}, {name: '张三', age: 18}, {name: '李四', age: 20}, {name: '', age: 30}].filter(item => item.name).map(item => ({...item, disabled: item.age >= 18 ? false : true}))
尽管这种形式要遍历两次,不过集体感觉还算简略,那能不能遍历一次就能解决呢。显然是能够的,应用 Array.flatMap()
[{name: '小明', age: 15}, {name: '张三', age: 18}, {name: '李四', age: 20}, {name: '', age: 30}].flatMap(item => item.name ? [{...item, disabled: item.age >= 18 ? false : true}] : [])
flatMap
更像是 map 和 filter 的结合体,但 flatMap 的性能更弱小一些,它让咱们能够更轻微的操作数组中的每一项,比方:
const arr = [1,3].flatMap(number => {return [number, 2 * number, 3 * number];
})
// [1, 2, 3, 3, 6, 9]
flatMap
的工作形式很简略,他会对数组中的每一项进行一次扁平化解决,因而示例返回的等价于 [...[1,2,3], ...[3,6,9]]
。如果要拍平一个二维数组,能够间接应用 [[2,3],4].flatMap(item => item)
,当然拍平数组最简略的形式是用 [[2,3],4].flat(Infinity)
。
如何高效的解决数组映射首发于聚享小站,如果对您有帮忙,不要遗记点赞反对一下呦🎉