JS 数组扁平化及类型判断

82 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第30天,点击查看活动详情

数组是日常开发中再常见不过的数据类型,下面的应用场景的各种解法都是前端需要掌握的操作

  • 多维数组降维(数组扁平化)
  • 分数组和对象

1. 多维数组降维

多维数组降维其实就是 数组扁平化 的实现。

  • 方法一:将数组转化为字符串,再转化为一维数组
let arr = [[1, 2, 3], [7, 8, 9] ] 
arr += ''; 
arr = arr.split(','); 
console.log(arr);

或者:

console.log(arr.join(',').split(','))

运行结果:

image.png
  • 方法二:递归
    • 将多维数组传入递归函数
    • 如果遍历的数据不是数组类型,则将此元素放到新数组中
    • 如果是数组类型,需要再次调用方法进行递归
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)

运行结果:

image.png
  • 方法三:数组原型上的 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))

运行结果:

一层深度和全部深度展开的差别还是较为明显的。

image.png

2. 如何区分数组和对象?

除此之外,数组的各种相关的操作场景,还可能会遇到区分数组和对象,下面列举几种可以判断的方法:

  • 方法一:Array.isArray(ES6 语法)
Array.isArray([]) //true 
Array.isArray({}) //false 

运行结果:

image.png
  • 方法二:instanceof
[] instanceof Array //true
{} instanceof Array //false 

运行结果:

image.png
  • 方法三: constructor
{}.constructor //返回 object
[].constructor //返回 Array

运行结果:

image.png
  • 方法四:Object.prototype.toString.call()
Object.prototype.toString.call([]) //["object Array"]
Object.prototype.toString.call({}) //["object Object"]

运行结果:

image.png