常用的数组方法
一、不影响原数组(参见forEach)
1、forEach(fn(value, index, array), [caller]) (IE8+)
(1) forEach 并不能修改自身的子项,但若子项是 非基本类型,则可以修改子项的值
[1,2,{}].forEach(v => 1) // [1,2,3]
[1,2,{}].forEach(v => v['name'] = 1) // [1,2,{name:1}] 对第三个参数array的修改将影响原数组
(2) forEach 不循环空值
[1,,3].forEach(v => console.log(v)) // 1,3(3) caller 用于指定this,默认为 window
2、some
3、every
4、indexOf
5、lastIndexOf
6、reduce(fn(previous, current, index, array), [initialValue]) (IE9+)
(1) 递归调用,上一次循环的return值作为下一次的previous
(2) 在不指定初始值的情况下,默认取数组的第一个值作为初始值,后一个值作为当前值
7、join(separator)
数组拼接成字符串,操作对象可以为多维数组,数组项为对象时,该对象表现为 [object Object],空数组将作为一个空数组项
[1,2,[3,'a',[],{}]].join(',') // "1,2,3,a,,[object Object]" 二、修改原数组
1、push
2、pop
3、shift
4、unshift
5、splice([start, num, ...])
(1) 从数组中添加/删除项目,返回被删除的项目
(2) 前两个参数为 开始删除的下标 与 删除的数量(0则不删除),第三个及之后的参数可选,为在 start 处插入的新项
(3) 若第一个参数为负则从末尾开始计算(可视为 length+start = index), 计算后的值 <0 也视为 0
6、sort(a,b)(3) 若第一个参数为负则从末尾开始计算(可视为 length+start = index), 计算后的值 <0 也视为 0
(1) 不指定排序规则时,默认按 ascll 码从小到大排序,必要时临时转为字符串后比较, 但undefined会被排到尾部
(2) return a-b 从小到大; return b-a 从大到小
7、concat(arr, [...])
将一或多个参数合并到原数组,参数可以为非数组
[1,2,3].concat('a', [4,5,6]) // [1, 2, 3, "a", 4, 5, 6] 8、reverse数组倒序,返回修改后的原数组
三、返回新数组
1、map(fn(value, index, array)) (IE8+)
2、filter(fn(value, index, array)) (IE8+)
3、slice([start, end])
查询指定下标的数组段, 参数为空时默认取首尾,为负时表示从后往前数,若end的下标小于等于start则返回空数组
[1,2,3,4,5].slice(1,-1) // [2, 3, 4]
四、数组的使用技巧
1、清空数组的最佳实践 arr.length = 0
2、数组求和 eval(arr.join("+")) // 因为eval的安全性和性能,不推荐使用
arr.reduce(function(p,c){return p+c})
3、取最大值 Math.max.apply(Math, arr) 4、复制数组 arr.slice()
5、数组去重
[...new Set([1,1,2,3])] // ES6
// 若考虑兼容性则可遍历借用 indexOf 判断
var ret = []; [1,1,2,3].forEach(function(v,i,a){ a.indexOf(v) === i && ret.push(v) }) // 仅保留第一次出现的值
[...new Set([1,1,2,3])] // ES6
// 若考虑兼容性则可遍历借用 indexOf 判断
var ret = []; [1,1,2,3].forEach(function(v,i,a){ a.indexOf(v) === i && ret.push(v) }) // 仅保留第一次出现的值
