数组
扩展操作符
ES6中可使用扩展操作符在一个数组字面量中包含另一个数组
let a = [1, 2, 3]
let b = [0, ...a, 4] // [0, 1, 2, 3, 4]
// 扩展操作符可用于任何可迭代对象
let digits = [..."adsadassfasfasfsff"] // ["a", "b", "s", ..., "f", "f"]
// 若想去重,可借助集合
let letters = [ ...new Set(digits)]
稀疏数组
稀疏数组就是数组中有空位,其length值大于实际元素的个数
let c = ["0"]
c[10] = "10"
c[3] = undefined
console.log(c) // [ '0', <2 empty items>, undefined, <6 empty items>, '9' ]
迭代稀疏数组,会发现空位为undefined,但并非表示空位的值是undefined
for(let i of c){
console.log(i) // 空位为undefined
}
console.log(c.length) // 11
console.log(1 in c) // c[1]为真正的空值,没有元素,返回为false
console.log(3 in c) // c[3]为undefined元素,并非真的没有元素,返回为true
forEach可以感知到稀疏数组,并跳过空位
c.forEach(element=>{
console.log(element) // foreach能感知到稀疏数组,并跳过空位
})
filter过滤
filter传入一个回调函数,去除返回值为false的元素,返回一个新的数组
let arr = [5, 4, 3, 2, 1]
let arrFilter = arr.filter(x => x<3) // 过滤掉大于等于三的元素,返回新数据
filter会自动过滤掉稀疏数组中的空位,返回稠密数组
arr.filter(() => true) // 所以可以使用filter过滤空值
find与findIndex
let f = arr.find( x => x===3) // 返回第一个匹配项,找不到返回undefined
let fIdx = arr.findIndex( x => x > 3) // 返回第一个匹配项的索引,找不到返回-1
every与some
every只有所有项都匹配时,才会返回true;some只要有一个匹配项,就返回true
arr.every( x => x <10)
arr.some( x => x === 3)
reduce 与 reduceRight
归并,根据条件返回一个最终结果,reduceRight()是从右向左归并
arr.reduce((x, y) => x + y) // 条件是求和,那么就逐一相加,每次的结果将取代x,并进行下一次归并
arr.reduce((x, y) => (x > y) ? x : y, 100) // 条件为找出最大值,第二个参数为初始的x值,结果为100
map
map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
let strArr = ["hello world", "the definitive guide"]
strArr.map(x => x.split(" ")) // [ [ 'hello', 'world' ], [ 'the', 'definitive', 'guide' ] ]
flat()与flatMap()打平数组
let matrix = [1, [2, [3, [4]]]]
matrix.flat() // [ 1, 2, [ 3, [ 4 ] ] ]
matrix.flat(1) // [ 1, 2, [ 3, [ 4 ] ] ]
matrix.flat(2) // [ 1, 2, 3, [ 4 ] ]
matrix.flat(3) // [ 1, 2, 3, 4 ]
matrix.flat(4) // [ 1, 2, 3, 4 ]
flatMap() 等同于(但效率远高于) map().flat(),可以把flatMap理解为通用版的map
let strArr = ["hello world", "the definitive guide"]
strArr.flatMap(x => x.split(" ")) // [ 'hello', 'world', 'the', 'definitive', 'guide' ]
concat()
添加数组,原始数组不变, 可以打平数组,但不会递归的打平嵌套的数组
let addArr = [1, 2, 3]
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()切片
let arr = [5, 4, 3, 2, 1]
arr.slice(0, 2) // [5, 4] [0, 2) 前闭后开
arr.slice(3) // [2, 1] 从索引3开始到结尾
arr.slice(1, -1) // [4, 3, 2] 支持负索引
fill()填充
可只填充切片部分
let farr = new Array(5)
farr.fill(0) // [0, 0, 0, 0, 0]
farr.fill(9, 1) // [0, 9, 9, 9, 9]
farr.fill(8, 2, -1) // [0, 9, 8, 8, 9]
copyWithin()
copyWithin(index, startIndex, endIndex),把指定切片复制到指定索引处,会修改原数组, 支持负索引
let arr = [5, 4, 3, 2, 1]
arr.copyWithin(1) // [5, 5, 4, 3, 2]
arr.copyWithin(2, 3, 5) // [5, 5, 3, 2, 2]
arr.copyWithin(0, -2) // [2, 2, 4, 2, 2]
其他
indexOf lastIndexOf 查找匹配项中第一个和最后一个的索引,没有返回-1
includes() ES6新方法测试数组中是否包含某个值,返回true或false
sort( a, b =>{ return a - b }) 若 < 0,则a在前,若 > 0,则b在前
arr.join("+") 可以理解为split的反向操作,若不传参数,则默认为使用","相连
Array.isArray([]) 用于确定一个未知值是否是数组,返回true或false
arr.length = 3 修改数组长度会截断数组