开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情
数组是日常开发中再常见不过的数据类型,下面的应用场景的各种解法都是前端需要掌握的操作
- 多维数组降维(数组扁平化)
- 分数组和对象
1. 多维数组降维
多维数组降维其实就是 数组扁平化 的实现。
- 方法一:将数组转化为字符串,再转化为一维数组
let arr = [[1, 2, 3], [7, 8, 9] ]
arr += '';
arr = arr.split(',');
console.log(arr);
或者:
console.log(arr.join(',').split(','))
运行结果:
- 方法二:递归
- 将多维数组传入递归函数
- 如果遍历的数据不是数组类型,则将此元素放到新数组中
- 如果是数组类型,需要再次调用方法进行递归
let arr = [1, [2, 3, 4], [5, 6, 7, [8, 9, [10, 11, 12]]]]
let result = []
const getArr=(array)=>{
array.forEach((item)=>{
Array.isArray(item) ? getArr(item) : result.push(item)
})
}
getArr(arr)
console.log(result)
运行结果:
- 方法三:数组原型上的 flat() 方法
- 默认深度为 1
- 使用 Infinity 作为深度,任意深度的嵌套数组都可以展开
- 参数也可以是其它代表深度·的数字
Array.prototype.flat()
let arr = [1, [2, 3, 4], [5, 6, 7, [8, 9, [10, 11, 12]]]]
console.log(arr.flat())
console.log(arr.flat(Infinity))
运行结果:
一层深度和全部深度展开的差别还是较为明显的。
2. 如何区分数组和对象?
除此之外,数组的各种相关的操作场景,还可能会遇到区分数组和对象,下面列举几种可以判断的方法:
- 方法一:Array.isArray(ES6 语法)
Array.isArray([]) //true
Array.isArray({}) //false
运行结果:
- 方法二:instanceof
[] instanceof Array //true
{} instanceof Array //false
运行结果:
- 方法三: constructor
{}.constructor //返回 object
[].constructor //返回 Array
运行结果:
- 方法四:Object.prototype.toString.call()
Object.prototype.toString.call([]) //["object Array"]
Object.prototype.toString.call({}) //["object Object"]
运行结果: