数组的常用方法总结

一、基本使用
1、数组的创建
(1) 通过[]

let arr1 = [1, 2, 3, 4, 5]

(2) 通过创建构造函数 Array的实例

let arr2 = new Array(1, 2, 3, 4, 5)
console.log(arr2) // [1, 2, 3, 4, 5]

需要注意的是,如果构造函数中传入的参数只有一个数字,此时会被认为这个数字为数组的长度,如下所示

let arr3 = new Array(6) // 并不是代表创建 [6], 而是创建长度为6的空数组
console.log('arr3--',arr3)
构造函数创建空数组.png

想要解决这个问题可以通过下面这种方式创建数组
(3) 使用Array构造函数上的静态方法 Array.of

let arr4 = Array.of(6)
console.log(arr4) // [6]

也可以传入多个数字,此时和 new Array() 用法一致

let arr5 = Array.of(1, 2, 3, 4, 5)
console.log(arr5) // [1, 2, 3, 4, 5]

2、数组转字符串
以下有三种方法都可以使数组变成字符串,toString()和String()会给每个字符以逗号(,)分隔,join以传入的指定分隔符分隔,不传的时候就不会有分隔符

let list1 = ['a', 'b', 'c']

let arr1 = list1.toString()
let arr2 = String(list1)
let arr3 = list1.join('')

console.log('arr1--',arr1) // a,b,c
console.log('arr2--',arr2) // a,b,c
console.log('arr3--',arr3) // abc

3、字符串转数组
使用split对数组进行分割,可以看作是join的反向操作,Array的静态方法from,只要该数据类型有length属性,就可以使用 Array.from 将它转成数组

let message = 'hello'
let list1 = message.split('')
let list2 = Array.from(message)

console.log('list1--', list1) // ["h", "e", "l", "l", "o"]
console.log('list2--', list2) // ["h", "e", "l", "l", "o"]

4、循环
数组的循环方式非常多,可以根据不同的场景需要选择不同的循环方式

let list = [ 'a', 'b', 'c', 'd' ]
for(let i = 0; i < list.length; i ++)
for(let i in list)
for(let item of list)
list.map()
list.forEach()

5、展开语法
我们知道,当一个数组赋值给一个变量的时候,赋值的是内存地址,当原数组发生了改变的时候,被赋值的变量也会发生改变。
有时候我们并不希望两个数组指向同一片内存地址,这时候使用展开语法就能很好的解决问题。
展开语法相当于把数组里的每一个元素都拿出来,放到一个新的数组里,这个新数组指向的新的内存空间。

let list1 = ['kiki', 'alice']
let list2 = list1
let list3 = [...list1]

list1.push('windy')
console.log('list1--', list1) // ["kiki", "alice", "windy"]
console.log('list2--', list2) // ["kiki", "alice", "windy"]
console.log('list3--', list3) // ["kiki", "alice"]

6、解构赋值
解构赋值在对象里更常用一些,不过数组中也是可以使用解构赋值的,解构定义的变量与数组的索引值一一对应

let user = [ 'kiki', 15 ]
let [ name, age ] = user

console.log(name, age) // kiki 15

二、增删改查
1、增加
push 从尾部增加, 返回值为数组的长度
unshift 从头部增加, 返回值为数组的长度

let list = ['a', 'b', 'c', 'd']
    
console.log(list.push('x')) // 5
console.log(list.unshift('y')) // 6
console.log(list) // ["y", "a", "b", "c", "d", "x"]

2、删除
pop 从尾部删除元素, 返回值为删除的元素
shift 从头部删除元素, 返回值为删除的元素

let list = ['a', 'b', 'c', 'd']
    
console.log(list.pop()) // d
console.log(list.shift()) // a
console.log(list) // ["b", "c"]

3、修改
splice这个方法很好用,可以删除、增加、修改原数组,第一个参数传递的是需要定位到的索引值,第二个参数传递从当前索引值开始往后数几位数需要被删除,第三个参数开始传递的是需要增加的参数。
当不传第三个参数时,表示删除元素,当传递的第二个参数为0时,表示数组里一个元素都不删除,第三个往后的参数都可以添加到当前数组中

let list = ['a', 'b', 'c', 'd']
list.splice(2, 1, 'kiki')
console.log(list) // ["a", "b", "kiki", "d"]

4、查找
(1) 查找该元素第一次出现的索引值位置 indexOf从头部开始计算、lastIndexOf从尾部开始计算

let list = ['a', 'b', 'c', 'd', 'a', 'b', 'c']

console.log(list.indexOf('a')) // 0
console.log(list.lastIndexOf('a')) // 4

(2) 查找元素,传递一个查找规则的函数
find 查找数组中是否有存在符合条件的元素,存在即返回第一个符合条件的元素
findIndex 查找数组中是否有存在符合条件的元素,存在即返回第一个符合条件的元素索引值

let users = [
   { name: 'kiki', age: 16 },
   { name: 'alice', age: 17 },
   { name: 'macus', age: 18 }
]
let item = users.find(item=>{
   return item.age > 16
})
let index = users.findIndex(item=>{
   return item.age > 16
})
console.log(item) // { name: 'alice', age: 17 }
console.log(index) // 1

(3) 判断元素是否存在于该数组中 includes

let list = ['a', 'b', 'c', 'd']
 
console.log(list.includes('c')) // true
console.log(list.includes('f')) // false

(4) 判断元素是否符合条件
every 用来判断是否所有元素符合条件
some 用来判断是否有一个元素符合条件

let users = [
   { name: 'kiki', age: 16 },
   { name: 'alice', age: 17 },
   { name: 'macus', age: 18 }
]
let someFlag = users.some(item=>{
   return item.age > 16
})
let everyFlag = users.every(item=>{
   return item.age > 16
})
console.log(someFlag) // true
console.log(everyFlag) //false

三、复杂操作
1、合并元素,可以通过 concat 或者展开语法,两种方式都不会改变原数组

let list1 = ['a', 'b', 'c']
let list2 = [2, 4, 6]
let newList = list1.concat(list2)
let newArr = [...list1, ...list2]

console.log(list1) // ["a", "b", "c"]
console.log(list2) // [2, 4, 6]
console.log(newList) // ["a", "b", "c", 2, 4, 6]
console.log(newArr) // ["a", "b", "c", 2, 4, 6]

2、清空数组
(1) 将数组赋值为空数组 []

let list = [ 'a', 'b', 'c', 'd' ]
list = []

这样的方式可能存在一个问题,如果将list赋值给另外的数组,直接将list赋值为空时,arr的值并不会发生改变,因为最初的时候,arr和list都指向同一个内存地址,当list重新赋值后,则指向新的内存地址,此时arr仍然指向原来的内存地址

let list = [ 'a', 'b', 'c', 'd' ]
let arr = list
list = []
console.log(arr) // [ 'a', 'b', 'c', 'd' ]
console.log(list) // []

(2) 将元素的长度设置为0

let list = [ 'a', 'b', 'c', 'd' ]
let arr = list
list.length = 0
console.log(list) // []
console.log(arr) // []

(3) 通过 splice 截取数组

let list = [ 'a', 'b', 'c', 'd' ]
let arr = list
list.splice(0, list.length)
console.log(list) // []
console.log(arr) // []

(4) 不断的从头部/尾部删除元素

let list = [ 'a', 'b', 'c', 'd' ]
let arr = list
while(list.pop()){}
console.log(list) // []
console.log(arr) // []

3、过滤
filter与find不同,find只找出第一个符合条件的元素,但是filter会筛选中符合条件的所有元素

let users = [
   { name: 'kiki', age: 16 },
   { name: 'alice', age: 17 },
   { name: 'macus', age: 18 }
]
let items = users.filter(item=>{
   return item.age > 16
})
console.log(items)
// [{ name: 'alice', age: 17 }, { name: 'macus', age: 18 }]

4、排序
sort也需要传入一个函数,当传入的参数为 a - b,排序为正序

let list = [8, 5, 6, 7, 9, 12, 3]

list.sort((a, b)=>{
  return a - b
})
console.log(list) // [3, 5, 7, 8, 9, 12]

5、累加 reduce
reduce传入回调函数的参数会稍微多一点,比其他的函数要难理解一些。
第一个参数pre代表前一次执行reduce的结果,这里的操作是累加,reduce函数还可以传入第二个参数,代表初始化的值,如果没有传,pre就会取数组的第一个值。
回调函数里第二个参数current代表当前元素的值,第三个参数index代表当前元素的索引值,第四个参数代表执行reduce函数的数组

let list = [8, 5, 6, 7, 9, 12, 3]
let total = list.reduce(function(pre, current, index, arr){
    console.log(pre, current, index, arr)
    return pre + current
})
console.log(total)
累加.png

以上就是数组常用的方法,可能还有一些方法没有归纳进来,欢迎大家进行补充~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352

推荐阅读更多精彩内容