# 八.数据分类[Array]

前言

按照四个维度去探讨数组

  • 方法的作用
  • 需要传那些参数
  • 是否有返回值,返回值时什么
  • 通过此方法是否对原来的数组产生了改变

# 1.数组遍历

# 1.1 map

var newArry = ary.map(
  (item) => item * 10 /* 原来的数组不变,返回的新数组会变 */
)
1
2
3

# 1.2 forEach

  • 无法 break,可以用 try/catch 中 throw new Error 来停止
ary.forEach(function (item, index) {
  console.log(item, index) //数组中有几项函数就执行几次,原来的数组不变
})
1
2
3

# 2.数组筛选

# 2.1 filter

过滤

# 3.数组判断

# 3.1 some

有一项返回 true,则整体为 true

# 3.2 every

有一项返回 false,则整体为 false

# 4.数组转换

# 4.1 toString

把数组转换为字符串

//->toString()加参数没有作用
var ary = [1, 3, 5]
var res = ary.toString()
console.log(ary, res)
1
2
3
4

# 4.2 join

按照每一个分隔符,把数组中的每一个项拼接成一个字符串,原来的数组不变

var res = ary.join("+")
console.log(res) //“1+3+5”
//-->扩展:eval->js 中把字符串变为 js 表达式执行的一个方法
eval(ary.join("+"))
1
2
3
4

# 4.3 flatMap

一维数组转二维数组

[10, 21, 22, 2, 17, 11].flatMap((value, i, arr) => i % 2 ? [] : [arr.slice(i, i + 2)]) 
// [
//     [
//         10,
//         21
//     ],
//     [
//         22,
//         2
//     ],
//     [
//         17,
//         11
//     ]
// ]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 5.元素操作

# 5.1 push

var pushAry = [12, 23, 34]
var pushRes = pushAry.push(100) // 原来的数据已经发生了改变,返回新增加后数组的长度
pushAry.push(...[1, 2, 3, 4]) // 向末尾增加多项
console.log("push", pushAry, pushRes)
1
2
3
4

扩展

不想使用 push,也想向数组的末尾增加内容

ary[ary.length] = 10
1

# 5.2 pop

  • 删除数组最后一项的内容
    • 参数:没有
    • 返回:被删除的那一项内容
    • 原有的数组也发生了改变
var res = ary.pop()
console.log(res, ary)
1
2

扩展

不用 pop 想删除最后一项的内容

ary.length--
ary.length -= 1
ary.length = ary.length - 1
1
2
3

# 5.3 unshift

向数组的开头增加一项

var res = ary.unshift(100)
console.log(res, ary)
1
2

# 5.4 shift

删除数组中的第一项

var res = ary.shift()
console.log(res, ary)
1
2
  • sort(fn)/reverse 排序与反转,改变原数组

# 5.5 concat

  • 作用:数组合并,浅拷贝

  • 参数:空 | 数组

  • 返回值:新数组

  • 原数组改变:否

  • 1.数组合并

ary1.concat(ary2) // 把 ary2 和 ary1 拼接 ary2 在后面
1
  • 2.浅拷贝
ary1.concat() // 把 ary1 克隆一份一模一样的数组
1

# 5.6 slice(start,end)

关于数组的截取和拼接

实现数组的截取,在原来的数组中截取某一部分

slice(n, m) // 从索引 n 开始,找到索引为 m 出(不包含 m),将找到的部分已一个新的数组返回,原来的数组不变
slice(n) // 从索引 n 开始一直找到数组的末尾
slice(0) // 克隆一份一模一样的数组原来的数组不变
slice(-n)
slice(n, -m)
slice(n, m) // n 大于 m
slice(-n, -m)
slice(n, m) // n 大于 arr.length
slice(n, m) // m 大于 arr.length
1
2
3
4
5
6
7
8
9

# 5.7 splice(start,number,value...)

返回删除元素组成的数组,value 为插入项,改变原数组

它既能实现删除,也能实现增加,还能实现修改

var ary = [1, 3, 6, 8]
//删除
ary.splice(n, m) //从索引 n 开始,删除 m 个元素,把删除的内容以一个新的数组的方式返回,原来的数组改变
var res = ary.splice(1, 3)
console.log(res, ary)
ary, splice(n) //从索引 n 开始,删除到数组的末尾
ary.splice(0) //把原来的数组中的每一项都删除,把之前的删除的每一项的值以一个新的数组返回(把之前的数组克隆了一份,并且清空了原来的数组)
ary.splice() //返回空数组
ary.splice(ary.length - 1, 0)
//修改
splice(n, m, x) //从索引 n 开始,删除 m 个,用 x 替代删除的部分
var res = ary.splice(2, 4, 1000)
//增加
splice(n, 0, x) // 从索引 n 开始,一个都不删除,把 x 增加到 n 的前面,原来的数组改变
splice(ary.length, 0, x)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  • indexOf/lastIndexOf(value,fromIndex) 查找数组项,返回对应的下标

# 6.整体操作

# 6.1 reduce

reduceRight(fn(pre,cur),defaultPrev)同理

两两执行,prev 为上次化简函数的 return 值,cur 为当前值(从第二项开始)

# 二维数组转一维数组

  • 方式一
arr.map(i => i.children).reduce((pre, next) => pre.concat(next), [])
1
  • 方式二
let a = [1, 2, [4, 5], 6, 7, [8,[12,34,[333,44]]]]

new Function(`return [${a}]`)() // [1, 2, 4, 5, 6, 7, 8, 12, 34, 333, 44]
1
2
3

# 6.2 reverse

把数组倒过来排列原数组也改变

var ary = [2, 4, 523, 6, 7, 766, 23, 34]
var res = ary.reverse()
console.log(res, ary)
1
2
3

# 6.3 sort

  • 给数组进行排序,原有的数组会改变()
  • sort()只能处理 10 以内的数组,因为他是按照 unicode 编码的值排列的
var ary = [2, 4, 7, 6, 7, 3, 1, 8]
var res = ary.sort() // [1, 2, 3, 4, 6, 7, 7, 8]
1
2
  • sort( (a, b) => a-b)处理10以上的数组
var ary = [2, 4, 523, 6, 7, 766, 23, 34]
var res = ary.sort( (a, b) => a-b) // [2, 4, 6, 7, 23, 34, 523, 766]
1
2
let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
var res = arr.sort( () =>Math.random()-0.5)
1
2

提示

更多的数组方法

console.dir(Array.prototype)
1