数组的常规算法
一. 数组的赋值及声明
length为数组的唯一属性
Array JS中的内置对象
数组为object对象(object为浏览器最大对象),所以数组什么数据类型都可装
数组简化声明 var arr=[ ];
var arr=new Array(); //new 初始化新建对象
console.log(typeof (arr)); //object
//数组的赋值
arr[0]=1;
arr[1]="a";
arr[2]=null;
arr[3]={};
arr[4]=true;
arr[5]=undefined;
arr[6]=function(){};
console.log(arr); //[1, "a", null, {…}, true, undefined, ƒ]
//直接赋值
var arr2=new Array(1,2,3);
console.log(arr2); //[1, 2, 3]
二. 数组里边的算法
1.concat
数组合并
字符串中也有此方法
var a=[1,2,3];
var b=[4,5,6];
var c=["1","2"];
console.log(a.concat(b).concat(a)); //[1, 2, 3, 4, 5, 6, 1, 2, 3]
console.log(a.concat(c)); //[1, 2, 3, "1", "2"]
2.filter
过滤数组 返回过滤出的值(有过滤条件,一定要写return返回值)
三个参数(值,索引,数组)
感觉也有数组遍历的意思在其中,数组遍历后,过滤出返回符合条件的值
var e=[1,3,4,4];
var filt=e.filter(function(val,index,arr){
console.log(val,index,arr);
//1 0 (4) [1, 3, 4, 4]
3 1 (4) [1, 3, 4, 4]
4 2 (4) [1, 3, 4, 4]
4 3 (4) [1, 3, 4, 4]
}
)
var e=[1,2,3,4,4,5,6,7];
var fil=e.filter(function(val,index,arr){
if(val/2==2){ //过滤条件,符合条件的被过滤出
return val; //里边一定要有返回值
}
})
console.log(fil); //[4, 4]
3.forEach
数组的遍历 会改变原数组
只用来遍历数组,无返回值,会改变原数组(相当于for循环)
可以用来执行一些改变原数组的操作
与filter参数一样
var f=[1,6,8,3];
f.forEach(function(val,index,arr){
console.log(val, index, arr);
//1 0 (4) [1, 6, 8, 3]
6 1 (4) [1, 6, 8, 3]
8 2 (4) [1, 6, 8, 3]
3 3 (4) [1, 6, 8, 3]
})
var f=[1,6,8,3];
f.forEach(function(val,index,arr){
console.log(val, index, arr);
//1 0 (4) [1, 6, 8, 3]
6 1 (4) [1, 6, 8, 3]
8 2 (4) [1, 6, 8, 3]
3 3 (4) [1, 6, 8, 3]
})
var bianli=f.forEach(function (a, b, c) {
f[b] += a;
return a;
})
console.log(bianli); //undefined
console.log(f); //[2, 12, 16, 6]
4.map
数组的遍历 但有返回值
与forEach对比记忆,两个都是数组的遍历,参数也均相同
一般要是选出特定的数值,要用filter ,用map遍历后不符合的也会输出undefined
forEach | map |
---|---|
没有返回值 | 有返回值 |
会改变原数组 | 不会改变原数组 |
var g=[1,6,3,8,3];
var map= g.map(function(a,b,c){
console.log(a, b, c);
//1 0 (5) [1, 6, 3, 8, 3]
6 1 (5) [1, 6, 3, 8, 3]
3 2 (5) [1, 6, 3, 8, 3]
8 3 (5) [1, 6, 3, 8, 3]
3 4 (5) [1, 6, 3, 8, 3]
if(g[b]==3){
return b; //[undefined, undefined, 2, undefined, 4]
}
// return 1; //[1, 1, 1, 1, 1]
})
console.log(map);
5.join
将数组转化为字符串 对象.join()
split将字符串转化为数组
用括号中的字符将他们分开
var f=[1,2,3,4,5,6];
console.log(f.join()); //1,2,3,4,5,6
console.log(f.join("")); //123456
console.log(f.join(",")); //1。2。3。4。5。6
6.indexOf
找到指定数组元素返回索引,找不到返回-1
字符串中也有此方法
多个重复元素,只返回第一个索引值
var d=[1,2,3,4,5,6,3];
console.log(d.indexOf(3)); //2
7.slice
截取数组 (开始,结束) 返回截取的数组
字符串中也有此方法,也是对原数组无影响,返回值为截取后的数组
8.splice
(开始,长度) 对原数组有影响
也可以叫数组的删除,删除数组中间元素,因为会影响原数组
与substr类似
var j=[1,2,3,5,1];
console.log(j.slice(2, 1)); //[] 没有的话,返回空集
console.log(j.slice(1, 4)); //[2, 3, 5]
console.log(j.splice(2, 1)); //[3]
console.log(j); //[1, 2, 5, 1]
增数组的追加
9.push
往后追加 会改变原数组
返回值为数组的长度
unshift 往前追加
var t=[1,5,8,3,2];
console.log(t.push(4)); //6
console.log(t); //[1, 5, 8, 3, 2, 4]
console.log(t.unshift(1));//7
console.log(t);//(7) [1, 1, 5, 8, 3, 2, 4]
删 10.shift前删
改变原数组的值(删除)
pop后删
var v=[1,2,3,4,5,6];
v.shift();
console.log(v); //[2, 3, 4, 5, 6]
v.pop();
console.log(v); //[2, 3, 4, 5]
删除中间的 splice
11.reserve
反转数组
var v=[2, 3, 4, 5];
console.log(v.reverse()); //[5, 4, 3, 2]
12.sort
数组排序 从小到大 对原数组有影响
发现sort只能处理一位数。若有多位数,只能识别多位数的第一位数进行排序
var q=[1,8,4,46,2,8];
var q2=[1,8,4,5,2,8];
console.log(q.sort()); // [1, 2, 4, 46, 8, 8]
console.log(q); // [1, 2, 4, 46, 8, 8]
console.log(q2.sort()); // [1, 2, 4, 5, 8, 8]
console.log(q2); // [1, 2, 4, 5, 8, 8]
底层方法 改变底层sort方法将数组从 大到小 排序
var qq=q.sort(function(n1,n2){
return n1-n2;
});
console.log(qq); // [1, 2, 4, 8, 8, 46]
var qq=q.sort(function(n1,n2){
return n2-n1;
});
console.log(qq); // [46, 8, 8, 4, 2, 1]
13.some
检测数组中的值 返回值为true/flase
值存在返回true,值不存在flase
三个参数
var s=[1,2,3,4,3];
var ss=s.some(function(a,b,c){
console.log(a, b, c);
//1 0 (5) [1, 2, 3, 4, 3]
2 1 (5) [1, 2, 3, 4, 3]
3 2 (5) [1, 2, 3, 4, 3]
4 3 (5) [1, 2, 3, 4, 3]
return a==4;
})
console.log(ss); //返回值为 true
14.reduce
累加器
应用:数组求和,累乘
index参数一般用不到
三个参数 totle:计算结束的返回值;current:当前元素;
var m=[1,3,6,10];
var re=m.reduce(function(totle,current,index){
console.log(totle, current,index);
//1 3 1
4 6 2
10 10 3
return totle+=current; // 20 累加器
return totle*=current; // 180 累乘器
})
console.log(re);