js数组中常用的方法以及应用

237 阅读2分钟

一、数组的拍平

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));
}