数组的常见api们
join
Array.join 方法是将数组中所有元素都转化为字符串连接在一起。可以指定一个字符来分割每个字符串。默认为逗号
var a = [1,2,3,undefined]
a.join() // 1,2,3,
a.join("") // 123
a.join("-") // 1-2-3-
Array.join 是 String.split的逆向操作
reverse
Array.reverse方法可以将数组元素的顺序颠倒。这个方法会改变原有的数组
var a = [1,2,3,undefined]
a.reverse()
console.log(a) // [undefined,3,2,1]
sort
Array.sort方法将数组排序并返回排序后的数组,这个方法会改变原有的数组
当不带参数的进行比较时,排序将会以字母表顺序进行,数字从小到大排列
当元素出现undefined时,排序后将会被排在最后,关于其他的排序规则可以看下面这个例子
var a = [1,NaN,2,3,undefined,4,NaN,'b','a',null,Infinity,-Infinity]
a.sort()
console.log(a) // [ -Infinity, 1, 2, 3, 4, Infinity, NaN, NaN, 'a', 'b', null, undefined ]
当然,如果希望是以其他的标准进行排序,那么就要传入一个比较函数作为参数
假设第一个参数应该在前,那么我们就要返回一个小于0的值。反之则传入一个大于0的值。假设两个值相等,就应该返回0(不做交换)
例子:
var a = [2,3,1,4,6]
a.sort((a,b)=>{
return a-b
})
console.log(a) // [1,2,3,4,6]
concat
Array.concat函数创建并且返回一个新数组,他的元素包括了调用concat的原始数组和concat的每个参数。以及concat会去除一层扁平化(不会递归的扁平化数组),以及用来进行类数组和数组的转换。
var a = [1,2,3]
a.concat(4,5) // [1,2,3,4,5]
a.concat([4,5]) // [1,2,3,4,5]
a.concat([4,5],[6,7]) //[1,2,3,4,5,6,7]
a.concat(4,[5,[6,7]]) // [1,2,3,4,5,[6,7]]
slice
Array.slice返回指定数组的一个片段或子数组,他的两个参数分别指定了起始位置和结束位置,他并不会改变原数组。
注意:截取的数组包含了第一个参数代表的起始位置的元素,不包含第二个参数代表的终结位置的元素
若是出现负数,则-n表示去末尾起第n个数字
例子
var a = [1,NaN,2,3,undefined,4,NaN,'b','a',null,Infinity,-Infinity]
console.log(a.slice(-1)) // -Infinity
splice
Array.splice是插入和删除数组元素的通用方法。在删除或者插入元素后会更改他们相对应的索引值,他返回一个已删除元素的数组,如果没有删除元素,则返回空数组
第一个参数标注了删除或者插入的起始点(删除的时候包含了起始点)
第二个参数指定了应该从数组中删除的元素的个数。如果省略了第二个参数,从起始点到数组末尾所有的元素都将被删除。
紧跟其后的任意个参数表示了插入的具体元素
例子:
var a = [1,2,3,4,5,6,7,8]
a.splice(4) // 返回 [5,6,7,8] a = [1,2,3,4]
a.splice(1,2) // 返回[2,3] a = [1,4]
var b = [1,2,3,4,5]
b.splice(2,0,'a','b') // 返回 [] a = [ 1, 2, 'a', 'b', 3, 4, 5 ]
b.splice(2,2,[1,2],3) // 返回 ['a','b'] a = [ 1, 2, [ 1, 2 ], 3, 3, 4, 5 ] ,和concat不同,他不会去扁平化
toString
该方法将元素转化为字符串。 也可用于去一层扁平化。
foreach
foreach方法将数组从头遍历至尾,为每个元素调用指定的函数,三个函数按顺序分别是 value,index,array
会改变原有数组
例子:
var data = [1,2,3,4,5]
var sum = 0
data.foreach((v)=>{
sum += v
})
sum // 15
// 每个元素的值平方
data.foreach((v,i,a)=>{
a[i] = v*v
})
data //[1,4,9,16,25]
foreach无法在将全部元素传递给函数之前结束,想结束只能把它放在try...catch中。
map
map函数看起来和foreach有点类似,都是将数组的每个元素传递给指定的函数,并且返回一个数组
但是map方法的传入的函数应该是有返回值的,并且map方法并不会改变原数组。如果是稀疏数组,反悔的也是相同方式的细数数组,具有一样的长度,相同的缺失元素。
var a = [1,2,3]
var b = a.map((v)=>{
return v*v
}) // [1,4,9]
filter
filter方法返回的是调用的数组的一个子集。传递的函数用来做逻辑判断,该函数应当返回一个true或者false。函数的调用和之前的一样。
var a = [1,2,3,4,5]
var b = a.filter((v)=>{
return v>2
}) // [3,4,5]
注意。filter()会跳过稀疏数组中缺少的元素,它返回的数组总是稠密的。
every和some
这俩方法是数组的逻辑判定,对数组元素应用指定的函数,返回true或者false
every方法表示所有的元素通过函数判定都为true
some方法表示只要有一个元素及以上通过函数判定为true
reduce和reduceRight
这两个方法使用指定的函数将数组进行组合。又称为注入或者折叠
reduce需要两个参数。一个是需要调用的化简函数,第二个(可选)则是化简结果的初始值
reduce调用的化简函数也和之前的那些调用函数不同。
他的第一个参数表示到目前为止化简操作的累计结果,第一次调用函数时,他就是reduce()中的第二个参数
后面的三个参数和之前相同,分别是value,index,array
注意reduce不会跳过空缺的元素。所以在使用之前最好保证数组是稠密的
例子
var b = [1,2,3,4,5]
var sum = b.reduce((sum,v,i,a)=>{
return sum+v
},0)
console.log(sum); //15
reduceRight只是和reduce组合数组的方向相反,但不表示他们的结果就是一样的,比如乘方,比喻交并集
indexOf和lastIndexOf
这两个方法搜索整个数组中具有给定值的元素,找到了就返回其index,没找到就返回-1
lastIndexOf和indexOf查找的方向相反,是从数组尾部开始。
indexOf的第一个参数是给定的需要搜寻的值
第二个参数是开始搜索位置的索引值(可选)
数组类型的判断
ES5以后
使用Array.isArray即可
用ES3方法
//检测o是否为数组
function isArray(o){
if(typeOf o = 'object' && Object.prototype.toString.call(0).splice(8,-1) == 'Array'){
return true
}
return false
}