跳到主要内容

Array

数组判断

var arr = []

arr instanceof Array

Array.prototype.isPrototypeOf(arr)

arr.constructor === Array

Object.prototype.toString.call(arr) === "[object Array]"

Array.isArray(arr)

数组转化

var set = new Set([1, 2])

// 类数组对象以及部署了遍历器接口的对象
Array.from(set)

[...set]

// 只能转化类数组对象 (arguments和Nodelist)
Array.prototype.slice.call(arguments)

数组去重

var arr = [1, 2, 2, 4, 9, 6, 7, 5, 2, 3, 5, 6, 5]


// Set
Array.from(new Set(arr))


//缺点: indexOf或者includes都是遍历数组,时间复杂度高
function unique(arr) {
let newArr = []
for (let i = 0; i < arr.length; i++) {
let item = arr[i]
if (!newArr.includes(item)) {
newArr.push(item)
}
}
return newArr
}

// 把数组的值放在对象的键值里, 对于 数组中的 1 和 “1” , 要再一次对比
// 空间复杂度高, 所谓的空间换时间
function unique(arr) {
let newArr = []
let obj = {}
for (let i = 0; i < arr.length; i++) {
let item = arr[i]
let type = typeof item
if (!obj[item]) {
newArr.push(item)
obj[item] = [type]
} else if (!obj[item].includes(type)){
newArr.push(item)
obj[item].push(type)
}
}
return newArr
}

// 排序法,先用sort排序再比较
// 相比前两种,时间和空间用的都没那么多
// 缺点:排序了
function unique(arr) {
arr.sort()
let newArr = [arr[0]]
for (let i = 0; i < arr.length; i++) {
let item = arr[i]
if (newArr[newArr.length - 1] !== item) {
newArr.push(item)
}
}
return newArr
}

数组扁平化

flat(Infinity)

var arr = [1, 2, [3, [4, 5]]]

arr.flat(Infinity)

JSON.stringify + 正则 + JSON.parse

var arr = [1, 2, [3, [4, 5]]]

function flat(arr) {
let str = JSON.stringify(arr).replace(/[\[|\]]/g, '')
str = `[${str}]`
return JSON.parse(str)
}

递归

function flatter(arr) {
let newArr = []
arr.forEach(item => {
if (Array.isArray(item)) {
// newArr.push(...flatter(item))
newArr = newArr.concat(flatter(item))
}
else {
newArr.push(item)
}
})
return newArr
}

Reduce + 递归

var arr = [1, 2, [3, [4, 5]]]
function flatter(arr) {
return arr.reduce((prev, next) => {
return prev.concat(Array.isArray(next) ? flatter(next) : next)
}, [])
}

[].concat(...arr)

var arr = [1, [2, [3, 4]]];
console.log([].concat(...arr)); // [1, 2, [3, 4]]
// 该操作可以拍平一层

var arr = [1, [2, [3, 4]]];

function flatten(arr) {

while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr);
}

return arr;
}

console.log(flatten(arr))

reduce 实现 map

Array.prototype.map = function (fn) {
let result = []
this.reduce((total, current, index) => {
result.push(fn(current))
}, [])
return result
}

数组乱序

let arr = [1, 2, 3, 4, 5]
arr.sort(() => {
return Math.random() - 0.5
})

// 加强版
// 遍历数组,每一项和该项之前的随机项交换位置
function shuffle(arr) {
for (let i = 0; i < arr.length; i++) {
let j = ~~(Math.random() * (i + 1));
[arr[i], arr[j]] = [arr[j], arr[i]]
}
}

常用方法

var arr = [2, 7, 0, 6, 1, 4, 8, 3]
arr.sort((a, b) => a - b) // 递增
arr.sort((a, b) => b - a) // 递减