数组的创建
//创建一个数组
let colors = new Array(); //Array []
//创建一个数组并指定长度
let colors = new Array(20); //Array(20)
//创建一个数组并赋值
let colors = new Array("red","blue","green");//Array(3)["red","blue","green" ]
在创建数组的时候,最好采用省略new操作符的形式,数组中可以存储不同类型的元素,如下:
let colors = [];
let colors = [20];
let colors = ["red","blue",1];
数组的元素的访问
let colors = ["red","blue","green"]
console.log(colors[0]); //显示第一项 "red"
colors[2] = "black"; //修改第三项
colors[3] = "brown"; //新增第四项
console.log(colors) //(4) ["red", "blue", "black", "brown"]
① 通过方括号加索引值访问;
② 设置在索引值在范围内的其他值,可以替换指定位置的值;
数组中添加元素
let colors = [];
colors.push("red","blue");
console.log(colors); //["red","blue"]
② 索引值超过了数组现有的项数来添加。因为索引值是从0算起的,所以数组的长度总比索引值大1;
let colors = ["red","blue","green"];
colors[colors.length] = "black";
console.log(colors); //["red","blue","green","black"];
③ unshift(),将元素添加到数组的前端;
let colors = ["red","blue","green"];
colors.unshift("black");
console.log(colors); //["black","red","blue","green"];
④ splice() ,可以指定位置插入任意数组的项。至少需要三个参数:起始位置,0和要插入的项.当然也可以插入多项。
let arr = ["George","John","Thomas","James","Adrew","Martin"];
arr.splice(2,0,"William")
console.log(arr);
//["George","John","William","Thomas","James","Adrew","Martin"];
数组中删除元素
let arr = ["George","John","William","Thomas"];
let deleteItem1 = arr.pop();
console.log(deleteItem1); //“Thomas”
console.log(arr); //["George", "John", "William"]
② arrayObj.shift(); 移除最前一个元素并返回该元素值,数组中元素自动前移;
let arr = ["George","John","William","Thomas"];
let deleteItem2 = arr.shift();
console.log(deleteItem2); //“George”
console.log(arr); //["John", "William", "Thomas"]
③ arrayObj.splice(start,length); 删除从指定位置start开始的指定数量length的元素,数组形式返回所移除的元素;
let arr = ["George","John","William","Thomas"];
let deleteItem3 = arr.splice(0,2);
console.log(deleteItem3); //["George", "John"]
console.log(arr); //["William", "Thomas"]
④ 指定数组的length小于它的长度
let arr = ["George","John","William","Thomas"];
arr.length = 2;
console.log(arr); //["George","John"]
数组中替换元素
let arr = ["George","John","William","Thomas"];
let arr2 = ["George","John","William","Thomas"];
let deleteItem = arr.splice(0,1,"123"); //返回被替换的值
console.log(deleteItem); //["George"]
console.log(arr); // (4) ["123", "John", "William", "Thomas"]
let deleteItem2 = arr2.splice(0,2,"123","456"); //返回被替换的值.可以替换多个值
console.log(deleteItem2); //(2) ["George", "John"]
console.log(arr2); // ["123", "456", "William", "Thomas"]
数组的截取、合并和复制
let arr = ["George","John","William","Thomas"];
let getArray = arr.slice(1,3);
console.log(getArray); //(2) ["John", "William"]
console.log(arr); //(4) ["George", "John", "William", "Thomas"]
let getArray2 = arr.slice(1);
console.log(getArray2); //(3) ["John", "William", "Thomas"]
console.log(arr.slice(0)); //(4) ["George","John","William","Thomas"]
② 数组的合并:arrayObj.concat(arrayObj2);
let arr = ["George","John","William","Thomas"];
let arr2=["123","456"];
let arr3=arr.concat(arr2);
console.log(arr3);
//(6) ["George", "John", "William", "Thomas", "123", "456"]
数组的字符串化
let arr = ["George","John","William","Thomas"];
console.log(arr.join(',')); //George,John,William,Thomas
console.log(arr.join('-')); //同理,以-隔开
console.log(arr.join(' ')); //以空格隔开
console.log(arr); //(4) ["George", "John", "William", "Thomas"]
数组的排序
let arr = [1,5,8,9,6,3];
console.log(arr.reverse()); //[3, 6, 9, 8, 5, 1]
console.log(arr.sort()); //[1, 3, 5, 6, 8, 9]
console.log(arr.sort().reverse()); //[9, 8, 6, 5, 3, 1]
数组的高级用法
let colors = ["red", "blue"];
colors.push("brown"); // 添加另一项
colors[3] = "black"; // 添加一项
console.log(colors.length); // 4
let item = colors.pop(); // 取得最后一项
console.log(item); //"black"
console.log(colors); //(3) ["red", "blue", "brown"]
队列方法:队列数据结构的访问规则是 FIFO (First-In-First-Out,先进先出) 。队列在列表的末端添加项, 从列表的前端移除项。结合使用 shift() 和 push() 方法,可以像使用队列一样使用数组(会改变原数组):
let colors = new Array(); //创建一个数组
let count = colors.push("red", "green"); //推入两项
console.log(count); //2
count = colors.push("black"); //推入另一项
console.log(count); //3
let item = colors.shift(); // 取得第一项
console.log(item); //"red"
console.log(colors); //(2) ["green", "black"]
② 数组的去重
let arr = ['red', 'blue', 'green', 'blue'];
console.log(arr.indexOf("blue")); // 1
console.log(arr.indexOf("black")); // -1
方法1:遍历数组法
function unique(arr){
let n = [];
for(let i = 0; i < arr.length; i++){
//如果当前数组的第i+1个元素已经保存进了临时数组,那么跳过,
//否则把当前项push到临时数组里面
if (n.indexOf(arr[i]) == -1){
n.push(arr[i]);
}
}
return n;
}
let testArry = [1,2,5,5,6];
console.log(unique(testArry)); //[1, 2, 5, 6]
方法2:数组下标判断法(与方法一类似)
function unique(arr){
let n = [arr[0]]; //结果数组
//从第二项开始遍历
for(let i = 1; i < arr.length; i++) {
//如果当前数组的第i项在当前数组中第一次出现的位置不是i,
//那么表示第i项是重复的,忽略掉。否则存入结果数组
if (arr.indexOf(arr[i]) == i){
n.push(arr[i]);
}
}
return n;
}
let testArry = ["hello",2,5,5,6,"hello"];
console.log(unique(testArry)); //["hello", 2, 5, 6]
方法3:给传入数组排序,排序后相同值相邻,然后遍历时新数组只加入不与前一值重复的值。
function unique(arr){
// 按从小到到排序
arr.sort();
let re = [arr[0]];
for(let i = 1; i < arr.length; i++){
if( arr[i] !== re[re.length-1]) {
re.push(arr[i]);
}
}
return re;
}
let testArry = ["hello",2,5,5,6,"hello"];
console.log(unique(testArry)); //[2, 5, 6, "hello"]
方法4:对象属性法。
function unique(arr){
let arr1 = [];
let obj = {};
for(let i = 0;i <arr.length; i++){
if(!obj[arr[i]]){
obj[arr[i]] = arr[i];
arr1.push(arr[i]);
}
}
return arr1;
}
let testArry = ["hello",2,5,5,6,"hello"];
console.log(unique(testArry)); //(4) ["hello", 2, 5, 6]
③ 迭代方法
- forEach 遍历数组一次 ,可以使用三个参数:数组对象、元素索引以及数组本身 ;
let testArry = ["hello",2,5,6];
let arr = [];
testArry.forEach(
function (item, index) {
if(item > 4){
arr.push(item);
}
});
console.log(arr); //[5, 6]
- every() 返回一个布尔值(true或false),判断数组所有项是否符合指定函数的条件,符合为true,反之为false(在第一个不符合处就会中断并返回);
let testArry = [10,8,5,6];
let isBiggerThan7 = testArry.every(
function(ele, index, arr){
return (ele >= 7);
}
); //false
let isSmallerrThan10 = testArry.every(
function(ele,index,arr){
return (ele <= 10);
}
); //true
- some() 返回一个布尔值(true或false),判断每个数组项是否符合指定函数的条件,只要有任何一项返回为true,就会返回true;
let testArry = [10,8,5,6];
let isBiggerThan7 = testArry.some(
function(ele,index,arr){
return (ele >= 7);
}
); //true
- filter() 每个数组项调用指定的函数,条件为true的将返到一个新数组中,相当于是筛选数组里面的内容;
let testArry=[10,8,5,6];
let BiggerThan7 = testArry.filter(
function(ele,index,arr){
if(ele >= 7){
return true;
}
}
);
console.log(BiggerThan7); //[10, 8]
console.log(testArry); //[10, 8, 5, 6]
- map() 每个数组项调用指定的函数,返回每次函数调用的结果组成一个新数组。用法基本和forEach一样,但是有个区别,forEach没有返回值,map有返回值;
let testArry = [10, 8, 5, 6]; let newArry1 = testArry.map( function(ele,index,arr){ if(ele >= 7){ return ele; }else{ return false; } } ); console.log(newArry1); //[10, 8, false, false]
- reduce():从第一项开始逐个遍历到最后。它接收两个参数 array.reduce(callback, initialValue), callback 函数接受4个参数:之前值(previous)、当前值(current)、索引值(index)以及数组本身(array)。 initialValue可选,表示初始值。若指定,则当作最初使用的previous值;如果缺省,则使用数组的第一个元素作为previous初始值,同时current往后排一位。
let testArry = [10,8,5,6];
let result = testArry.reduce(
function(previous, current, index, array){
return previous + current;
});
console.log(result); //29,其实做的就是累加操作,也可做累乘操作
- reduceRight(): 从数组的最后一项开始,遍历到数组的第一项。用法同reduce基本一样,只是开始的位置从右边第一位开始,区别仅此而已。
let testArry = [10,8,5,6];
let initialValue = 10;
let result = testArry.reduceRight(
function(previous, current, index, array){
return previous + current;
});
console.log(result); //29,还是累加操作
let result1 = testArry.reduceRight(
function(previous, current, index, array){
return previous + current;
},initialValue);
console.log(result1); //39,加上initialValue的值
es6新增加的数组方法
let a = Array.from('hello');
console.log(a); // ['h', 'e', 'l', 'l', 'o']
// 没有传length,结果返回了一个空数组,验证了第一个注意点
let obj = {"name":"yh","age":"18","sex":"男"}
console.log(Array.from(obj)); //[]
// 有传length,但不是类数组,返回三个undefined, 验证了第二个,第三个注意点
let obj2 = {"name":"yh","age":"18","sex":"男",length: 3};
console.log(Array.from(obj2)); //[undefined, undefined, undefined]
// 有传length,并且对象是类数组
let obj3 = {"0":"yh","1":"18","2":"男",length: 3}
console.log(Array.from(obj3)); //["yh", "18", "男"]
// key值不从0起,验证了注意点3
let obj4 = { "1":"yh","2":"18","3":"男",length: 3};
console.log(Array.from(obj4)); //[undefined, "yh", "18"]
② Array.of(); Array.of方法用于将一组值,转换为数组。
let a = Array.of(3, 9, 10);
let b = Array.of(3);
console.log(a); //[3, 9, 10]
console.log(b); //[3]
console.log(b.length); //1
这个方法其实和普通的创建数组的方法没有太大区别,需要特别注意的就是当参数只有一个时:
let a = Array(3,9,10);
let b = Array(3);
console.log(a); //[3, 9, 10]
console.log(b); //(3) [empty × 3]
console.log(b.length); //3
③ find() 和 findIndex()
let array = [3, 9, 10, 15, 6, 20];
let fn = array.find(
function(value,index,arr){
return value > 10;
}
);
console.log(fn); //15 当找到第一个值的时候,就会停止继续查找
let fn2 = array.find(
function(value,index,arr){
return value > 30;
}
);
console.log(fn2); //undefined
let fn3 = array.findIndex(
function(value,index,arr){
return value>10;
}
);
console.log(fn3); //3,返回的时满足条件的第一个元素的下标
let fn4 = array.findIndex(
function(value,index,arr){
return value>30;
}
);
console.log(fn4); //-1
let array = ['a','b','c'];
array.fill(7); //所有元素替换成7
console.log(array); //[7, 7, 7]
let array2 = ['a','b','c','d','e'];
array2.fill(7,1,3); //下标为 1和2的元素替换成7
console.log(array2); //["a", 7, 7, "d", "e"]