数组方法的使用

80 阅读4分钟

操作数组末尾的方法

1.push在数组末尾添加数据,返回数组的新长度

var arr = [1, 2, 3, 4]
 //push 会改变原数组
arr.push(5)
 console.log(arr)
 输出结果:[1, 2, 3, 4, 5]

2.pop在数组末尾删除一个数据,返回被删除的元素(最后一个)

var arr = [1, 2, 3, 4]
//pop 会改变原数组
arr.pop()
console.log(arr)
输出结果:[1, 2, 3]

操作数组最前面的方法

1.unshift在数组第一个的位置添加数据,返回数组的新长度

var arr = [1, 2, 3, 4]
//unshift 会改变原数组
arr.unshift(0)
console.log(arr)
输出结果:[0,1, 2, 3, 4]

2.shift在数组第一个的位置删除一个,返回数组第一个元素

var arr = [1, 2, 3, 4]
//shift 会改变原数组
arr.shift()
console.log(arr)
输出结果:[ 2, 3, 4]

操作数组任何位置的方法

splice可以删除数据也可以添加数据
splice有三个参数:
1.索引值,从参数给的索引值开始添加或删除数据
2.数字,删除几个元素,可以是0,表示不删除元素,如果不写会从第一个参数开始处删除后面所有的数据
3.要添加的元素

vai arr = [1, 2, 3, 4, 5]
//splice 也会改变原数组
arr.splice(1,2)
console.log(arr)
输出结果:[1, 4, 5]

从索引为 2 开始删除了两个,并添加了两个新元素 red和 pink(删除可以删除很多条,添加也可以添加多条)返回的值是删除元素的数组[3, 4]

vai arr = [1, 2, 3, 4, 5]
arr.splice(2, 2, 'red','pink')
console.log(arr)
输出结果:[1, 2'red', 'pink', 5]

第二个参数为零就不会删除,只会从索引 2 开始添加数据,不删除返回的值是空数组[]

vai arr = [1, 2, 3, 4, 5]
arr.splice(2, 0, 'red')
console.log(arr)
输出结果:[1, 2, 'red', 3, 4, 5]

上面这些方法在 useState 里的使用注意

1.数据改变,地址也要变(原数组数据改变了,地址也要改变)

const [arr,setArr] = useState([1, 2, 3, 4])
arr.push(5)
//setArr(arr),不会重新渲染
setArr([...arr])//[...arr]相当于给 arr 指了一个新地址

2.push 和 pop 成本更低一些,因为它们改变 useState 只会使后面部分改变,而unshift 和 shift 还有 splice 会使页面全部或者部分重新渲染,成本要高一些

map和 forEach 的区别

var arr = [1, 2, 3, 4]
arr.map(item => item + 20)//[21, 22, 23, 24]
//返回的值是函数处理后的数组,不改变原数组

arr.forEach(item => item + 20)//undefined
//返回的值是 undefined

map和 forEach的用法差不多,当我们遍历不需要结果的时候,用 forEach 更好一点

排序

sort 可以对数组进行排序

var arr = [2, 3, 4, 1]
//sort 是对原数组进行排序,会改变原数组,所以在 useState里用[...arr]
1.正序
arr.sort((a,b) => (a - b))
结果为[1, 2, 3, 4]

2.倒序
arr.sort((a,b) => (b - a))
结果为[4, 3, 2, 1]

过滤和包含

1.filter 过滤数组中不满足条件的元素

var arr = [1, 2, 3, 4]
//filter 会生成一个新数组将慢煮条件的返回到新数组中,不会改变原数组,不会对空数组进行检测
let data = arr.filter(item => item > 2)
console.log(data)
输出结果 [3, 4]

2.includes判断数组里是否包含某个元素

var arr = [1, 2, 3, 4]
//includes 有两个参数:1.要查找的元素,2.索引值(可不写),返回结果为布尔值
arr.includes(3)
结果为 true
arr.includes(3, 3)//索引 3 在数组中为 4 后面已经没有 3 了,所以为 false
结果为 false
arr.includes(3, 2)
结果为 true

对数组元素进行计算

reduce从左到右计算
reduce 接收两个参数:第一个是处理元素的函数,第二个是初始值
一.处理元素的函数有四个参数:
1.total,(必需)初始值,或者计算结束后的返回值
2.currentValue,(必需)当前元素
3.currentIndex,(可选)当前元素索引
4.arr,(可选)当前元素所属的数组对象
二.传递给函数的初始值
初始值可选,不写初始值会默认为数组第一个

var arr = [1, 2, 3, 4]
arr.reduce((total,item) =>(total += item),0 )
返回的结果为计算后的值:10
var arr = [1, 2, 3, 4]
arr.reduce((total,item) => console.log(total));
输出结果:1

合并数组

concat 将两个或多个数组合并

var arr1 = [1, 2, 3]
var arr2 = [4, 5, 6]
var arr3 = [7, 8, 9]
//concat 会合并到一个新数组里面,返回新数组
let data1 = arr1.concat(arr2)
console.log(data1)
输出结果:[1, 2, 3, 4, 5, 6]
let data2 = arr1.concat(arr2,arr3)
console.log(data2)
输出结果:[1, 2, 3, 4, 5, 6, 7, 8, 9]

concat和 push的区别

1.push遇到数组数据时,直接把这个数组作为一个元素,添加到原数组中;concat则是拆分数组数据,将数据一个一个添加到新数组中 2.push 会改变原数组,concat 不会改变原数组。

var arr1 = [1, 2, 3]
var arr2 = [4, 5, 6]

//concat
let data = arr1.concat(arr2)
console.log(data)
输出结果:[1, ,2 3, 4, 5, 6]

//push
arr1.push(arr2)
console.log(arr1)
输出结果:[1, 2, 3, Array(3)]
所以如果要用 push 的话,就需要给它展开,相当于给它一个新地址
arr1.push(...arr2)