数组
数组是一组相关数据的集合
是一个特殊的对象 typeof(arr) ==="object"
创建数组
1.new Array() 创建的数组都会继承Array对象,可以使用很多数组内置的属性或者方法
var arr = new Array
var arr3 = new Array(3); // 如果传递一个数字参数,则是创建数组并指定数组的长度
console.log(arr3); // [empty × 3]
var arr3 = new Array("a", "a2", "a3"); // 如果传递是非数字或者参数大于1,则是设置为数组的元素。
console.log(arr3); // ['a', 'a2', 'a3']
2.利用字面量创建数组[]
var arr = []; //创建一个空数组
特性
-
数组元素索引从0开始 arr[索引] (数组操作 通过索引下标)
-
超出数组长度的索引 输出结果 undefined
-
数组索引到3 指定5号索引的内容 自动填充4索引,内容为空,输出为undefined
-
空位返回的值是undefined , length 包含空位empty
-
数组长度 arr.length
检测是否为数组
1.参数 instanceof Array
var arr = [1, 2, 3]
var string = "123"
console.log(arr instanceof Array); //true
console.log(string instanceof Array); //false
//后面还可以跟其他数据类型
var obj = {};
console.log(obj instanceof Object);//true
2.Array.isArray(参数) H5新增的方法,ie9以上版本支持
Array() 也是一个构造函数(可以构造一个数组出来)
console.log(Array.isArray(arr)); //true
console.log(Array.isArray(string)); //false
遍历数组
1.for循环遍历
for (var i=0;i<arr.length;i++){
console.log(arr[i])
}
2.内置方法 forEach()
可以遍历数组的每一个元素,item就是遍历数组的元素。
forEach遍历使不能使用break; 内部是一个回调函数 不能return
数组.forEach(function(item){
console.log(item);
})
3.es6 map(function(item,[index]){return item}) 遍历数组的成员,把成员作为函数的参数
函数里面需要返回一个成员,然后再返回一个新的数组。
可以用来修改数组的成员 , 不影响原数组
var arr1 = ["a", "b", "c", "d"];
var newArr = arr1.map(function (item) {
item += 666;
return item;
})
console.log(newArr); //['a666', 'b666', 'c666', 'd666']
console.log(arr1); //['a', 'b', 'c', 'd']
4.for...in 遍历数组
一般不用for in遍历,开销比较大
for(var item in arr1){ //item就是索引
console.log(arr1[item]);
}
伪数组 (类似数组对象)
具有length属性 按索引方式储存数据
不具有数组的push()、pop()等方法
函数的arguments参数就是一个类数组对象
数组方法
数组转字符串
原生js
var str = ""
for (var i = 0; i < arr.length; i++) {
str += arr[i] + ","
}
console.log(str)
内置方法
1.arr.toString()
var arr2 = ["zhangsan", "lisi", "wangwu", "lisi"];
console.log(arr2.toString()); //zhangsan, lisi, wangwu, lisi
2.arr.join(指定分隔符)
console.log(arr2.join()); //默认是逗号 zhangsan, lisi, wangwu, lisi
console.log(arr2.join("-")); //zhangsan-lisi-wangwu-lisi
添加元素
push() 数组末尾 添加一个或多个元素
返回结果为新数组的长度 会改变原数组
var arr = [1, 2, 3]
res = arr.push(4, 5, "13") //6
unshift() 数组的头部 添加一个或多个元素
返回结果为新数组的长度 会改变原数组
res = arr.unshift("hello",5) //8
concat() 可以接受其他类型的参数,把参数作为数组元素合并到数组里面。
push是在原数组的基础上操作,concat是返回一个新的数组。
console.log(arr1.concat("aaaa",{name:"test"}));
删除一个元素
pop() 数组末尾 删除一个元素 一次只能删除一个
返回被删除的元素 会改变原数组
pop没有参数
res = arr.pop() //"13"
shift() 数组的头部 删除一个元素 一次只能删除一个
返回被删除的元素 会改变原数组
shift没有参数
res = arr.shift() //"hello"
delete 删除数组的元素
位置会被保留, 为空,一般不用delete删除数组元素。
var arr2 = ["a", , "b", "c"];
delete arr2[0]
console.log("-------------");
console.log(arr2[0], arr2) //undefined [empty × 2, 'b', 'c']
删除多个元素splice
重点splice() 数组删除splice(第几个开始,要删除个数)
还可以在删除的位置添加新的数组元素
返回被删除项目的新数组
注意,这个会影响原数组
var arr = ['pink', 'blue', 'black', 1, 'hh'];
1.只删除不添加
console.log(arr.splice(2, 2)); //['black', 1]
console.log(arr);//['pink', 'blue', 'hh']
2.删除且添加
console.log(arr.splice(2, 2,'red',666)); //['black', 1]
console.log(arr);//['pink', 'blue','red',666, 'hh']
3.不删除只添加
console.log(arr.splice(2, 0,'red',666)); //['black', 1]
console.log(arr);//['pink', 'blue','red',666,'black', 1, 'hh']
截取slice
slice() 数组截取slice(begin,end)
包括begin,不包括end 即 begin<=item<end
如果end省略,则是截取到结尾
返回被截取项目的数组 参数为索引号 可以为负值
不影响原数组
var arr = ['pink', 'blue', 'black', 1, 'hh'];
console.log(arr.slice(1, 5)); //从1开始 截取到5之前 ['blue', 'black', 1, 'hh']
console.log(arr.slice(1, -1)); // ['blue', 'black', 1] 倒数第一个为-1,依次类推
console.log(arr); //['pink', 'blue', 'black', 1, 'hh'];
获取元素索引
arr.indexOf( ) 从前面开始查找
arr.lastIndexOf( ) 从数组元素的后面开始查找
一般用来检测数组中是否存在该数据
如果找到数据,返回的是索引下标号 无法找到该元素,返回-1
只返回第一个满足条件的索引号
判断是否有该元素
in 运算符可以判断数组里面是否有该元素 更常用indexOf()
var arr1 = ["a", "b", "c", 3, { a: 1 }, [1, 2, 3]]
console.log(3 in arr1); //true
console.log(31 in arr1);//false
过滤 filter
es6 filter(function(item){return true}) 用户过滤数组成员
满足条件的成员组成一个新的数组返回。
var arr2 = [1,3,2,4,7,8,10];
var newArr=arr2.filter(function(item){ // 返回一个新的数组
return item % 2 === 0; // 如果除2的余数为0,则是偶数,返回true,则会把该元素添加新数组里面。
})
console.log(newArr2); //[2, 4, 8, 10]
累计reduce
es6 reduce(function (a, b) { }); 依次处理数组的成员,最终累计为一个值。
reduceRight(),和reduce一样的作业,reduce是从左边开始累计,reduceRight是从右边开始累计。
第一次遍历: a是数组第一个元素,b是数组第2个元素。
第二次遍历: a则是上一轮的返回值,b则是第3个元素。......
var arr2 = [1, 3, 2, 5];
var res = arr2.reduce(function (a, b) {
return a + b;
})
console.log(res); //11
判断some/every
some(function( elem, index , arr) {return 条件 })
只要有一个成员返回true, 整个some返回值都是true, 否则返回false
var arr2 = [1, 3, 2, 5, 0];
var flag = arr2.some(function (ele) {
return ele > 2;
})
console.log(flag); //true
every(function (elem, index, arr) { })
所有成员返回true, 整个ervery返回值都是true, 否则返回false
var arr2 = [1, 3, 2, 5, 0];
var flag = arr2.every(function (ele) {
return ele > 2;
})
console.log(flag); //fasle
数组去重
核心算法:遍历旧数组,然后拿着旧数组的元素去查询新数组,如果该元素在新数组里面没有出现过就添加,否则不添加
利用 新数组.indexOf(数组元素) 如果返回值是-1就说明新数组里面没有该元素
var arr = [1,2,3,4,4,1,11,22,11,33,1];
var newArr = []
for (var i=0;i< arr.length;i++) {
if (newArr.indexOf(arr[i]) === -1){
newArr.push(arr[i])
}
}
console.log(newArr);
排序sort
冒泡排序
// 每次比一遍所有的数 冒出一个最大或者最小的数字
// 每次比较两个数字 交换位置
数组总长度为5
//第0轮 i=0, j<4=5-1-i
//0位置 1位置比较 0》1 交换两个位置的值
//1位置 2位置比较 0》1 交换两个位置的值
//2位置 3位置比较 0》1 交换两个位置的值
//3位置 4位置比较 0》1 交换两个位置的值
//第1轮 i=1, j<3=5-1-i
//0位置 1位置比较 0》1 交换两个位置的值
//1位置 2位置比较 0》1 交换两个位置的值
//2位置 3位置比较 0》1 交换两个位置的值
var arr = [11,22,12,3,111,21,21,3]
//第一层循环 来控制冒泡需要的轮数
for (var i=0;i<arr.length-1;i++) {
//第二层循环 控制每一轮比较的次数
for(var j=0;j<arr.length-i-1 ;j++){
//内部交换2个变量的值 前一个和后一个数组元素相比较
if (arr[j] > arr[j+1]){ //从小到大
//交换两个数组元素的值
var tmp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = tmp
}
}
}
console.log(arr)
内置方法 sort()
默认是按字典(a,b,c......)排序。可以接受一个函数作为参数,
a,b两个参数是数组的相邻两个元素,如果返回值大于0,表示第一个成员排在第二个成员后面,
其他则是第一个元素在第二个元素前面。会改变原数组,返回的也是排序后的数组。
a-b 是由小到大,b-a是由大到小。
var arr1 = [5, 34, 9, 12, 1];
arr1.sort(); //只对个位数起作用
console.log(arr1); // [1, 12, 34, 5, 9]
//改良方法
arr1.sort(function (a, b) {
return a - b;//升序 [1, 5, 9, 12, 34]
//return b - a;//降序 [34, 12, 9, 5, 1]
})
console.log(arr1);
数组反转
原生js
1 声明一个新数组 arrNew
2 把旧数组第五个元素过来(arr.length-1) 放在新数组第一个位置 (arr.[0]) arr.length
3 依次递减处理
var oldArr = [1, 2, 3, 4, 5] //得到数组为 [5,4,3,2,1]
var newArr = [];
for (var i = oldArr.length - 1; i >= 0; i--) {
newArr.push(oldArr[i]);
//newArr[newArr.length] = oldArr[i]
}
console.log(newArr)
内置方法
arr.reverse() 返回结果为反转后的数组 会改变原数组
var arr = [1, 2, 3, 4]
var res = arr.reverse(); // [4,3,2,1]
console.log(arr); // [4,3,2,1]
连接(拼接)数组concat()
concat() 连接两个或多个数组
不影响原数组 返回一个新的数组
concat() 可以接受其他类型的参数,把参数作为数组元素合并到数组里面。
push是在原数组的基础上操作,concat是返回一个新的数组。
var arr = ['pink', 1, 'hh'];
var arr1 = [666, 888];
console.log(arr.concat(arr1)); //['pink', 1, 'hh', 666, 888]
console.log(arr1.concat("aaaa",{name:"test"}));
valueOf()
返回数组本身
var arr3 = new Array("a", "a2", "a3");
console.log(arr3.valueOf()); //['a', 'a2', 'a3']