数组
数组和字符串之间相互转换
split()
split()
函数是将字符串转换为数组
1 | var sentence = 'the quick brown for jumped over the lazy dog' |
输出
1 | word 0: the |
join()、toString()
join()
toString()
两个方法可以将数组转化为字符串。这两个方法都返回一个包含数组所有元素的字符串,各元素之间默认用逗号分隔开
1 | var names = ['David', 'Cynthia', 'Raymond', 'mike'] |
输出
1 | David,Cynthia,Raymond,mike |
如果为join()
传入参数,则各元素之间使用传入的参数隔开
1 | var names = ['David', 'Cynthia', 'Raymond', 'mike'] |
输出
1 | David;Cynthia;Raymond;mike |
存取函数
indexOf()、lastIndexOf()
indexOf()
函数是最常用的存取函数之一,用来查找传进来的参数在目标数组中是否存在。如果目标数组包含该参数,就返回该元素在数组中的索引;如果不包含,就返回-1
。
1 | var name = ['jake', 'yu', 'lao'] |
输出
1 | yu is at: 1 |
如果数组中包含多个相同的元素,indexOf()
函数总是返回第一个与参数相同的元素的索引。lastIndexOf()
函数返回相同元素的最后一个元素的索引,如果没有找到相同元素,则返回-1
findIndex()
除IE以外的所有浏览器(非边缘)都支持Array.prototype.findIndex。但是Polyfill很好的解决了这个问题
1 | var indexOfStevie = myArray.findIndex(i => i.hello === "stevie"); |
兼容
1 | // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex |
由已知数组创建新数组
concat()、splice()
concat()
和splice()
方法允许通过已有的数组创建新数组。concat()
方法可以合并多个数组创建一个新数组,splice()
方法截取一个数组的子集创建一个新数组。
concat()
该方法的发起者是一个数组,参数是另外一个数组或者多个数组。作为参数的数组,其中的所有元素都被连接到调用concat()
方法的数组后面。下面的程序展示了concat()
方法的工作原理:
1 | var cisDept = ['jake', 'mike', 'jenn'] |
输出
1 | [ 'jake', 'mike', 'jenn', 'bryan', 'cynthia' ] |
splice()
splice()
方法从现有数组里截取一个新数组。该方法的第一个参数是截取的起始索引,第二个参数是截取的长度。该方法会改变原来的数组。如果第二个参数传入的是0
,则不删除
1 | var num = [1, 2, 3, 4, 5, 6] |
输出
1 | [ 2, 3, 4 ] |
添加和删除
push()、unshift()
push()
方法会将一个元素添加到数组末尾:
1 | var nums = [1, 2, 3, 4, 5] |
输出
1 | [ 1, 2, 3, 4, 5, 6, 7, 8 ] |
unshift()
方法会将一个元素添加到数组开头
1 | var nums = [1, 2, 3, 4, 5] |
输出
1 | [ 6, 7, 8, 1, 2, 3, 4, 5 ] |
pop()、shift()
pop()
方法可以删除数组末尾的元素,并返回该元素
1 | var nums = [1, 2, 3, 4, 5] |
shift()
方法可以删除数组开头的元素,并返回该元素
1 | var nums = [1, 2, 3, 4, 5] |
splice()
使用splice()
方法为数组添加元素,需提供如下参数
- 起始索引
- 需要删除的元素个数(不删除为0)
- 想要添加的元素
1 | var nums = [1, 2, 3, 4, 5] |
排序
reverse()
reverse()
可以对数组进行翻转
1 | var nums = [1, 2, 3, 4, 5] |
sort()
如果数组是字符串类型,那么数组的可变方法sort()
就非常好使:
1 | var name = ['David', 'Mike', 'Cynthia', 'Clayton'] |
但是如果数组元素是数字类型,sort()
方法的排序结果就不能让人满意了
1 | var nums = [3, 1, 2, 100, 4, 200] |
sort()
方法是按照字典顺序对元素进行排序,因此它假定元素都是字符串类型。为了让sort()
方法也能排序数字类型的元素,可以在调用方法是传入一个比较大小的函数。
1 | var nums = [3, 1, 2, 100, 4, 200] |
迭代器方法
这些方法对数组中的每个元素应用一个函数,可以返回一个值、一组值或者一个新数组
forEach()
该方法接受一个函数作为参数,对数组中的每个元素使用该函数。
1 | var nums = [1, 2, 3, 4, 5, 6, 7, 8] |
输出
1 | 1 1 |
every()
该方法接受一个返回值为布尔类型的函数,对数组中的每个元素使用该函数。如果对于所有的元素该函数返回值均为true
,则该方法返回true
。
1 | var nums = [2, 4, 6, 8] |
1 | var nums = [1, 2, 4, 6, 8] |
some()
some()
方法也接受一个返回值为布尔类型的函数,只有有一个元素使得该函数返回true
,该方法就返回true
1 | function isEven(num) { |
reduce()
reduce()
方法接受一个函数,返回一个值。该方法会从一个累加值开始,不断对累加值和数组中的后续元素调用该函数,直到数组中的最后一个元素,最后返回得到的累加值。
1 | function add(runningTotal, currentValue) { |
1 | add(1,2) --> 3 |
reduceRight()
方法和reduce()
方法不同,reduceRight()
是从右到左执行
map()
map()
和forEach()
有点儿像,对数组中的每个元素使用某个函数。两者区别是map()
返回一个新的数组,该数组的元素是对原有元素应用某个函数得到的结果。
1 | function curve(grade) { |
filter()
filter()
和every()
类似,传入一个返回值为布尔类型的函数。和every()
方法不同的是,当对数组中的所有元素应用该函数,结果均为true
时,该方法并不返回true
,而是返回一个新数组,该数组包含应用该函数后的结果为true
的元素。
1 | function isEven(num) { |
一行代码生成数组
作者:SarjuHansaliya
原文:仅用一行生成[0, 1, …, N-1]数列
使用下面一行代码,我们就可以生成0…(N-1)数列。
ES5
1 | Array.apply(null, {length: N}).map(Function.call, Number); |
简要说明:
- Array.apply(null, {length: N}) 返回一个由undefined填充的长度为N的数组(例如 A = [undefined, undefined, …])。
- A.map(Function.call, Number) 返回一个长度为N的数组,它的索引为I的元素为Function.call.call(Number, undefined, I, A)的结果。
- Function.call.call(Number, undefined, I, A)可转化为Number(I),正好就是I。
- 结果为:[0, 1, …, N-1]。
ES6
这里用到了Array.from
1 | Array.from(new Array(N),(val,index)=>index); |
简要说明:
- A = new Array(N) 返回一个有N个_小孔_的数组 (例如 A = [,,,…], 但是对于x in 0…N-1时A[x] = undefined)。
- F = (val,index)=>index 即 function F (val, index) { return index; }。
- Array.from(A, F) 返回一个长度为N的数组,它的索引为I的元素为F(A[I], I)的结果,也就是I。
- 结果为:[0, 1, …, N-1]。
One More Thing
如果你需要[1, 2, …, N]序列, 方法1可改为:
1 | Array.apply(null, {length: N}).map(function(value, index){ |
方法2可改为:
1 | Array.from(new Array(N),(val,index)=>index+1); |