一、 数组常用函数
1. 创建数组
let arr1 = Array.of(1,2,3)
let arr2 = [1,3,5]
let arr3 = new Array[1,4,5]
2. 可迭代对象
方法从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。
Array.from
let word = 'love'
let arr1 = Array.from(word) // ['l','o','v','e']
let arr2 = [...word] // ['l','o','v','e']
let arr3 = word.split('') // ['l','o','v','e']
let arr4 = Array.from([1, 2, 3], x => x + x)); // [2,4,6]
let circle_area = r => (Math.PI * r**2).toFixed(2)
let arr5 = Array.from([2,3,4], circle_area)
console.log(arr5) // ['12.56','28.27','50.27']
Array.map (返回一个新数组,不会改变原始数组)
注意:map() 不会对空数组进行检测。
var arr = [1,2,3,4];
arr.map((item,index,arr) => {
return item*10 //新数组为10,20,30,40
})
let res = [
{name:'alisj',sex:1,age:22},
{name:'lily',sex:2,age:23},
{name:'lily',sex:3,age:33}
]
let r = res.map(item => {
return {
title: item.name,
sex: item.sex === 1? '男':item.sex === 0?'女':'保密',
age: item.age
}
})
console.log(r)
// [{title: "alisj", sex: "男", age: 22},
{title: "lily", sex: "保密", age: 23},
{title: "lily", sex: "保密", age: 33}]
3. join 函数 (数组中的所有元素连接成一个字符串)
arr.join('xxx')
var b = arr.join(','); // b: '1,2,3'
var b = arr.join('*'); // b: '1*2*3'
4.数组元素的放入与取出
- push
push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度console.log([1,2,3,4].push(5))// 5 - unshift
unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。 - shift
shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。 改变了原数组
let arr = [1,3,4]
console.log(arr.shift()) // 1
console.log(arr) // [3,4]
- pop
pop() 方法用于删除并返回数组的最后一个元素。,并返回第一个元素的值。 改变了原数组
let arr = [1,3,4]
console.log(arr.pop()) // 4
console.log(arr) // [1,3]
5. splice函数(改变原始数组)
新增或删除数组的多个元素
Array.splice(begin, deleteCount, addItem1, addItem2...)
// a的初始值:[1,2,3,4,5]
var b = arr.splice(1,2)
// a: [1,4,5]
// b: [2,3]
var c = arr.splice(1,2,333,444)
// a: [1,333,444,4,5]
// b: [2,3]
6. slice函数(不改变原数组,创建新数组)
slice() 方法将数组中一部分元素浅复制存入新的数组对象,并且返回这个数组对象。
浅复制
语法:arr.slice([start[, end]])
let array = [1,2,3,4,5]
console.log(array.slice()) // [1,2,3,4,5]
console.log(array.slice(1,3)) // [2,3]
console.log(array) // 原数组[1,2,3,4,5]
浅复制 是指当对象的被复制时,只是复制了对象的引用,指向的依然是同一个对象。 由于slice是浅复制,复制到的对象只是一个引用,改变原数组array的值,array2也随之改变
拿到数组最后一个元素
console.log([1,2,3].slice(-1));//[3]
7. 合并数组 concat 函数 (创建新数组)
concat() 方法将传入的数组或者元素与原数组合并,组成一个新的数组并返回。
let arr = [1,2,3,4,5]
console.log(arr.concat(6,7)) // [1,2,3,4,5,6,7]
console.log(arr) //[1,2,3,4,5]
8. [...]数组合并
9. 寻找符合特定定条件的数组 find() findIndex()
find()函数用来查找目标元素,找到就返回该元素,找不到返回undefined。
findIndex()函数也是查找目标元素,找到就返回元素的位置,找不到就返回-1。
const arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
var ret1 = arr1.find((value, index, arr) => {
return value > 4
})
var ret2 = arr1.find((value, index, arr) => {
return value > 14
})
console.log('%s', ret1) // 5
console.log('%s', ret2) // undefined
var ret3 = arr1.findIndex((value, index, arr) => {
return value > 4
})
var ret4 = arr1.findIndex((value, index, arr) => {
return value > 14
})
console.log('%s', ret3) // 4
console.log('%s', ret4) // -1
10.判断各元素是否符合特定条件 every() , some()
every()是对数组中每一项运行给定函数,如果该函数对每一项返回true,则返回true。
some()是对数组中每一项运行给定函数,如果该函数对任一项返回true,则返回true。
function comparing(value, index ,array){
return value>0 && value < 20
}
let a01 = [1,3,10,-8,-10,77]
console.log(a01.every(comparing)) // false
console.log(a01.some(comparing)) // true
11. 筛选出符合特定条件的数组元素 filter()
var data = [1, 4, 7, 12, 21];
var result = data.filter(function(value) {
return value % 2 === 1;
});
console.log(result); //[1,7,21]
12. 循环访问数组 forEach()
let arr = [1,2,3,4,5,6]
function display(value){
console.log(value)
}
arr.forEach(display)
13. 判断特定元素的存在性 indexOf() 函数
查找元素在数组中第一次出现时的索引,如果没有,则返回-1
arr.indexOf(element, fromIndex=0)
* fromIndex 为开始查找的位置,缺省默认为0。
14. 判断特定元素的存在性 includes()函数
函数判断当前数组是否包含某个指定的值,如果是,则返回 true,否则返回 false。
arr.includes(element, fromIndex=0)
indexOfincludes 和唯一的区别就是includes能够发现NaN,而indexOf不能。
15. 自我复制并覆盖数组的部分元素(修改当前数组)
copyWithin() 在当前数组内部,将指定位置的成员复制到其他位置(会覆盖原有成员),然后返回当前数组
Array.prototype.copyWithin(target, start = 0, end = this.length)
target (必需):从该位置开始替换数据。
start (可选):从该位置开始读取数据,默认为0。如果为负值,表示倒数。
end (可选):到该位置前停止读取数据,默认等于数组长度。如果为负值,表示倒数。
let arr = [0,1,2,3,4,5]
let r = arr.copyWithin(2)
console.log(r) // [0,1,0,1,2,3]
let arr = [0,1,2,3,4,5]
let r = arr.copyWithin(2,1)
console.log(r) // [0,1,1,2,3,4]
let arr = [0,1,2,3,4,5]
let r = arr.copyWithin(2,-1)
console.log(r) //[0, 1, 5, 3, 4, 5]
let arr = [0,1,2,3,4,5]
let r = arr.copyWithin(2,1,4) // 从第3位开始 替换 ,替换从第2位开始,到第4位结束
console.log(r) // [0,1,1,2,3,5]
16. 反转数组元素的顺序 reverse()
17. 数组重新排序 sort()
18. 数组元素的匹配
同时设置多个变量的数据
var [a,b,c] = [1,2,3]
[a,c] = [4,5]
19. 访问并渐次处理数组各元素 reduce() reduceRrght()
reduce() 方法接收一个函数作为累加器,reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,
arr.reduce(function(prev,cur,index,arr){
...
}, init);
回调函数有4个参数,意思分别为
- prev: 第一项的值或上一次叠加的结果值
- cur: 当前会参与叠加的项
- index: 当前值的索引
- arr: 数组本身
const arr = [1, 2, 3, 4, 5]
const sum = arr.reduce((pre, item) => {
return pre + item
}, 0)
console.log(sum) // 15
使用reduce方法可以完成多维度的数据叠加
案例1:计算总成绩,且学科的占比不同
const scores = [
{subject: 'math', score: 88},
{subject: 'chinese',score: 95},
{subject: 'english',score: 80}];
const dis = { math: 0.5,chinese: 0.3,english: 0.2}
const sum = scores.reduce((pre,item) => {
return pre + item.score * dis[item.subject]
},0)
console.log(sum) // 88.5
案例2:处理树形结构数据
var data = [{
id: 1,
name: "办公管理",
pid: 0,
children: [
{
id: 2,
name: "请假申请",
pid: 1,
children: [
{
id: 4,
name: "请假记录",
pid: 2
},
{
id: 5,
name: "请假审批记录",
pid: 2
},
],
},
{
id: 3,
name: "出差申请",
pid: 1
}]
},
{
id: 6,
name: "系统设置",
pid: 0,
children: [
{
id: 7,
name: "权限管理",
pid: 5,
children: [
{ id: 8, name: "用户角色", pid: 6 },
{ id: 9, name: "菜单设置", pid: 6 },
]
}]
},
];
const arr = data.reduce((pre,item) =>{
const callee = arguments.callee //将运行函数赋值给一个变量备用
pre.push(item)
//判断当前参数中是否存在children,有则递归处理
if(item.children && item.children.length > 0) item.children.reduce(callee,pre)
return pre
},[]).map((item) => {
item.children = []
return item
})
console.log(arr)
// [{id: 1, name: "办公管理", pid: 0, children: Array(0)}
{id: 2, name: "请假申请", pid: 1, children: Array(0)}
{id: 4, name: "请假记录", pid: 2, children: Array(0)}
{id: 3, name: "出差申请", pid: 1, children: Array(0)}
{id: 5, name: "系统设置", pid: 0, children: Array(0)}
{id: 6, name: "权限管理", pid: 5, children: Array(0)}
{id: 7, name: "用户角色", pid: 6, children: Array(0)}
{id: 8, name: "菜单设置", pid: 6, children: Array(0)}]
案例3. reduce来计算一个字符串中每个字母出现次数
const str = 'jshdjsihh'
const obj = str.split('').reduce((pre,item) =>{
console.log('pre',pre)
pre[item] ? pre[item] ++ : pre[item] = 1
return pre
},{})
console.log(obj)
pre {}
pre {j: 1}
pre {j: 1, s: 1}
pre {j: 1, s: 1, h: 1}
pre {j: 1, s: 1, h: 1, d: 1}
pre {j: 2, s: 1, h: 1, d: 1}
pre {j: 2, s: 2, h: 1, d: 1}
pre {j: 2, s: 2, h: 1, d: 1, i: 1}
pre {j: 2, s: 2, h: 2, d: 1, i: 1}
{j: 2, s: 2, h: 3, d: 1, i: 1}