JavaScript 中的 Array

最近在加强 JavaScript 基础的学习,这里整理一下 Array,主要是一些数组方法。

一、扁平化多维数组

这个知识点是在一次面试中被问到的,没答上来,这里作下记录。

1、Array.flat(n)

Array.flat(n) 方法会按照一个可指定的深度(n,默认值为 1)递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。

1
2
3
4
5
6
7
8
9
10
11
12
let arr1 = [1, 2, [3, 4]]
arr1.flat() // [1, 2, 3, 4]

let arr2 = [1, 2, [3, 4, [5, 6]]]
arr2.flat() // [1, 2, 3, 4, [5, 6]]

let arr3 = [1, 2, [3, 4, [5, 6]]]
arr3.flat(2) // [1, 2, 3, 4, 5, 6]

//使用 Infinity,可展开任意深度的嵌套数组
let arr4 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]]
arr4.flat(Infinity) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

也可以利用递归和 concat 方法实现扁平数组:

1
2
3
4
5
6
7
8
9
function flatten(arr) {
while(arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr)
}
return arr
}

flatten([1, [2, 3]]) // [1, 2, 3]
flatten([1, [2, 3, [4, 5]]) // [1, 2, 3, 4, 5]

2、Array.toString()

1
2
3
4
//使用 Array.toString() 可以将数组转为字符串,再去除`,`即可得到数组
let arr5 = [1, 2, [3, 4, [5, 6, [7, 8, [9, 10]]]]]
arr5.toString() // '1, 2, 3, 4, 5, 6, 7, 8, 9, 10'
arr5.toString().split(',') // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

3、更多实现方法见 Array.prototype.flat()

二、数组去重

1、Array.from、Set

Array.from 可以将类数组转化为数组。Set 是 ES6 语法新出的一种定义不重复数组的数据类型。… 是扩展运算符,将 set 里面的值转化为字符串。

1
2
3
let list = [1, 2, 3, 3, 4, 4]
Array.from(new Set(list)) // [1, 2, 3, 4]
[...new Set(list)] // [1, 2, 3, 4]

2、用map存储数据,循环数组进行比对

1
2
3
4
5
6
7
8
9
10
11
12
13
14
distinct(list) {
let map = {}
let result = []
for (let i of list) {
if (!(i in map)) {
map[i] = 1
result.push(i)
}
}

console.log(result) // [1, 2, 3, 4]
}

this.distinct([1, 2, 3, 3, 4, 4])

三、数组排序

1、Array.sort

sort 是 Array 内置的排序方法,参数为一个函数。默认排序顺序是在将元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列时构建的。由于它取决于具体实现,因此无法保证排序的时间和空间复杂性。

1
2
3
4
let list = [2, 3, 1, 4]
list.sort() // [1, 2, 3, 4] 默认是升序
list.sort((a, b) => a - b) // [1, 2, 3, 4] 升序
list.sort((a, b) => b - a) // [4, 3, 2, 1] 降序

2、冒泡排序

参考另一篇随笔:JS 中的冒泡排序

1
2
3
4
5
6
7
8
9
10
11
12
13
let list = [2, 3, 1, 1, 4]

for (let i = 0 ; i < list.length - 1; i ++) {
for (let j = 0; j < list.length - i - 1; j ++) {
if (list[j] > list[j + 1]) {
let tmp = list[j]
list[j] = list[j + 1]
list[j + 1] = tmp
}
}
}

console.log(list) // [1, 1, 2, 3, 4]

3、选择排序

1
2
3
4
5
6
7
8
9
10
11
selectSort(list) {
for (let i = 0; i < list.length; i ++) {
for (let j = i; j < list.length; j ++) {
if (list[i] > list[j]) {
[list[i], list[j]] = [list[j], list[i]]
}
}
}
}

this.selectSort([2, 3, 1, 4]) // [1, 2, 3, 4]

三、数组的最大值

1、Math.max()

Math.max() 是 Math 对象内置的方法,参数是字符串。

1
2
Math.max(...[2, 3, 1, 4])       // 4
Math.max.apply(...[2, 3, 1, 4]) // 4

2、先排序再取最大值

四、合并数值

1、简洁写法

1
2
3
4
5
6
[1, 2, 3, 4].concat([5, 6])             // [1, 2, 3, 4, 5, 6]
[...[1, 2, 3, 4], ...[5, 6]] // [1, 2, 3, 4, 5, 6]

let list1 = [1, 2, 3, 4]
list1.push(...[5, 6])
console.log(list1) // [1, 2, 3, 4, 5, 6]

2、map、push

1
2
3
let list2 = [1, 2, 3, 4]
[5, 6].map(i => { list2.push(i) })
console.log(list2) // [1, 2, 3, 4, 5, 6]

五、判断是否包含值

1、includes、indexOf、find、findIndex

1
2
3
4
[1, 2, 3, 4].includes(4)                 // true
[1, 2, 3, 4].indexOf(4) // 3,存在则返回起始位置的索引,不存在则返回 -1
[1, 2, 3, 4].find(i => i === 4) // 4,如果数组中不包含则返回 undefined
[1, 2, 3, 4].findIndex(i => i === 4) // 3,存在则返回起始位置的索引,不存在则返回 -1

2、some

1
[1, 2, 3, 4].some(i => { return i === 4 })      // true,如果不包含则返回 false

六、过滤数组

1、filter

1
[1, 2, 3, 4].filter(i => i > 2)         // [3, 4]
以上

随笔标题:JavaScript 中的 Array

随笔作者:刘先玉

发布时间:2019年11月13日 - 09:56:49

最后更新:2019年11月13日 - 09:56:49

原文链接:https://liuxianyu.cn/article/js-array.html