数组API之常用方法
数组初步认识
数组是特殊的对象,所以typeof arr 一定是 'object'
看到的都是属性的值,键key就是从0开始逐级递增,还有天生自带length属性
会改变原有数组的:增删改
push
返回值:新增后数组的长度,即数组的新length值
参数:(elem1, elem2, ...)
let arr=[23,56,78,36,36,78,23,11,89,78,78];
console.log(arr.push(66,77,88,99))
console.log(arr);
console.log(arr.unshift(11,22,33))
console.log(arr);
用原生js也能增加
arr[arr.length] = 88;
unshift
在数组开头加
let arr=[23,56,78,36,36,78,23,11,89,78,78];
console.log(arr.unshift(11,22,33))
console.log(arr);
// 基于es6方式:展开运算符
arr=[100,200,300,...arr];
console.log(arr);
基于es6的方式:arr=[100, ...arr];
shift
删除第一个
返回值:删除的那个元素
let arr=[23,56,78,36,36,78,23,11,89,78,78];
console.log(arr.shift())
console.log(arr);
[start,...arr]=arr
console.log(arr);
注意:
不要用delete arr[0],因为length不会改变
pop
删除最后一个
返回值:被删除的那个元素
let arr=[23,56,78,36,36,78,23,11,89,78,78];
console.log(arr.pop())
console.log(arr);
arr.length--;
console.log(arr);
splice万能的
返回值:删除的元素组成的数组
修改:把原来的删除,然后用新东西占据
数组的查询和拼接
slice
截取:[start, end)
有个技巧:数组的克隆 arr.slice(0)
但是要注意,这个是浅克隆
concat
数组拼接
arr.concat()
toString
join
连接成字符串
let arr=[23,56,78,36,36,78,23,11,89,78,78];
console.log(arr.splice(0,0,10002))
console.log(arr);
console.log(eval(arr.join('+')));
indexOf / lastIndexOf / includes
数组中是否包含某一项;若不包含则返回 -1
排列和排序
reverse
把数组倒过来排列
sort
排序
a,b是相邻的两项,待排序的2个元素:
a是数组中后面的元素,即1号位置;
b是数组中前面的元素,即0号位置;
sort( ( a, b) => a-b; )
技巧:
所以看到 a-b、a>b,是升序;
看到b-a、a<b,是降序;
这几个例子很有趣:
let arr=[23,56,78,36,11,34,66,77,77];
const students = [
{ name: "Alex", grade: 23 },
{ name: "Devlin", grade: 56 },
{ name: "Eagle", grade: 78 },
{ name: "Sam", grade: 36 },
{ name: "Sam1", grade: 11 },
{ name: "Sam2", grade: 34 },
{ name: "Sam3", grade: 66 },
{ name: "Sam4", grade: 77 },
{ name: "Sam5", grade: 77 },
];
const grades = [
{ name: "Alex", grade: 23 },
{ name: "Devlin", grade: 56 },
{ name: "Alice1", grade: null},
{ name: "Eagle", grade: 78 },
{ name: "Sam", grade: 36 },
{ name: "Sam1", grade: 11 },
{ name: "Sam2", grade: 34 },
{ name: "Alice2", grade: null},
{ name: "Sam3", grade: 66 },
{ name: "Sam4", grade: 77 },
{ name: "Alice3", grade: null},
{ name: "Sam5", grade: 77 },
];
arr.sort((a,b)=>{
// console.log('-----');
// console.log(a);
// console.log(b);
return +(a<b) || -1;
})
console.log(arr);
students.sort((a,b)=>{
return +(a.grade<b.grade) || -1;
// return +(a.grade<=b.grade) || -1;
// return +(a.grade<b.grade) || +(a.grade===b.grade)||-1;
})
console.log(students);
grades.sort((a,b)=>{
// return b.grade-a.grade;
if(a.grade>b.grade) return -1;
if(a.grade===b.grade) return 0;
return 1;
})
console.log(grades);
// 需要被排序的数组
var list = ['Delta', 'alpha', 'CHARLIE', 'bravo'];
// 对需要排序的数字和位置的临时存储
var mapped = list.map(function(el, i) {
return { index: i, value: el.toLowerCase() };
})
// 按照多个值排序数组
mapped.sort(function(a, b) {
return +(a.value > b.value) || +(a.value === b.value) - 1;
});
// 根据索引得到排序的结果
var result = mapped.map(function(el){
return list[el.index];
});
console.log(result);
遍历
forEach
数组中有多少项,forEach就会被执行多少次