一、数组的拍平
1、如何将不知嵌套深度的数组拍平
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]
①使用Array.prototype.flat
var newArr = arr.flat(depth)参数depth指定要提取数组的深度结构,默认是1
flat还可以移除数组中的空项
使用Infinity可以展开任意深度的数组
在这里我们就可以使用arr.flat(Infinity)来将数组做拍平处理
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]
var newArr = arr.flat(Infinity)
// [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10②使用reduce和concat
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]
function flatten (arr) {
return arr.reduce((acc, curr) => Array.isArray(curr) ? acc.concat(flatten) : acc.concat(curr), [])
}
flatten(arr)③不使用递归,使用多层遍历来实现
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]
var stack = [...arr]
var result = []
while (stack.length) { var next = stack.pop() if (Array.isArray(next)) {
stack.push(...next)
} else {
result.push(next)
}
}
console.log(result.reverse())二、数组的去重
var arr = [1, 2, 2, 3, 4, 5, 5, 6, 7, 8, 9, 11, 12, 12, 13, 14, 10]①使用for...of...和includes
function distint (arr) {
let result = []
for (let i of arr) {
!result.includes(i) && result.push(i)
}
return result
}②使用Set
function distint (arr) {
return Array.from(new Set(arr))
}③使用对象hash
function distint (arr) {
var map = {}
var result = []
for (let i of arr) {
if (!map[i]) {
result.push(i)
map[i] = 1
}
}
return result
}④使用filters和indexOf
function distint (arr) {
return arr.filters((item, index) => {
return arr.indexOf(item) === index
})
}⑤使用Array.sort
function distint (arr) {
arr = arr.sort()
var result = [arr[0]]
for (var i = 1, len = arr.length; i < len; i++) {
arr[i] !== arr[i-1] && result.push(arr[i])
}
return result
}三、数组的排序
var arr = [1, 10, 11, 12, 13, 14, 2, 3, 4, 5, 6, 7, 8, 9]①冒泡排序
function bubbleSort (arr) {
var len = arr.length,
i,
j,
tmp
for (i = 0; i < len; i++) {
for(j = 0; j < len - 1; j++) {
if (arr[j] > arr[j+1]) {
tmp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = tmp
}
}
}
return arr
}②插入排序
③快速排序
function quickSort (arr) {
if (arr.length <= 1) reutrn arr
var left = [], right = [], i
var middleNum = arr.splice(Math.floor(arr.length/2), 1)[0] for (i = 0; i < arr.length; i++) { if (arr[i] <= middleNum) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return quickSort(left).concat([middleNum], quickSort(right))
}
function quickSort(arr) {
var left = [], right = [];
if (arr.length <= 1) {
return arr;
}
var num = arr.splice(Math.floor(arr.length / 2), 1)[0]
for (var i = 0; i < arr.length; i++) {
if (arr[i] <= num) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([num], quickSort(right));
}