js 数组方法(个人学习笔记)
首先,创建数组的两个方法:
1.构造函数:
var array = new Array();//新建一个空数组 var array1 = new Array(20);//新建一个长度为20位的空数组 var array2 = new Array("1","2");//新建一个内容包括有1,2两位的数组
2.字面量表示法
var arr6 = ["lily","lucy","Tom"]; // 创建一个包含3个字符串的数组 alert(arr6[0]); //lily arr6[1] = "mary"; //修改第二项为mary arr6[3] = "sean"; //增加第四项为sean
判断是否为数组的方法:
1.instanceof Array
用法:
var array = new Array(); console.log(array instanceof Array);//true
缺点:如果你从一个框架向另一个框架传入一个数组,那么传入的数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。这样的话,判断不了
2.Array.isArray()(推荐)
用法:var array = new Array(); console.log(Array.isArray(array));
数组方法:
下面开始介绍数组的方法,数组的方法有数组原型方法,也有从object对象继承来的方法,这里我们只介绍数组的原型方法,数组原型方法主要有以下这些:
join()
push()和pop()
shift() 和 unshift()
sort()
reverse()
concat()
slice()
splice()
indexOf()和 lastIndexOf() (ES5新增)
forEach() (ES5新增)
map() (ES5新增)
filter() (ES5新增)
every() (ES5新增)
some() (ES5新增)
reduce()和 reduceRight() (ES5新增)
针对ES5新增的方法浏览器支持情况:
Opera 11+
Firefox 3.6+
Safari 5+
Chrome 8+
Internet Explorer 9+
对于支持的浏览器版本,可以通过Array原型扩展来实现。下面详细介绍一下各个方法的基本功能。
1.join();
作用:将数组整理成字符串(跟字符串方法split()相对应)
用法:只接收一个参数:即分隔符。
var arr = [1,2,3]; console.log(arr.join()); // 1,2,3 console.log(arr.join("-")); // 1-2-3 console.log(arr); // [1, 2, 3](原数组不变)
2.push()和pop()
作用:push方法是对数组新增作用,新值会加到数组最后,返回值是新的数组的长度,参数可接受任意数量。
pop()方法是对数组进行删除,删除数组最后一位,减少数组的 length 值,然后返回移除的项。不接受参数。
用法:
var arr = ["Lily","lucy","Tom"]; var count = arr.push("Jack","Sean"); console.log(count); // 5 console.log(arr); // ["Lily", "lucy", "Tom", "Jack", "Sean"] var item = arr.pop(); console.log(item); // Sean console.log(arr); // ["Lily", "lucy", "Tom", "Jack"]
3.shift() 和 unshift()
作用:
shift():删除原数组第一项,并返回删除元素的值;如果数组为空则返回undefined 。
unshift:将参数添加到原数组开头,并返回数组的长度 。
这组方法和上面的push()和pop()方法正好对应,一个是操作数组的开头,一个是操作数组的结尾。
用法:
var arr = ["Lily","lucy","Tom"]; var count = arr.unshift("Jack","Sean"); console.log(count); // 5 console.log(arr); //["Jack", "Sean", "Lily", "lucy", "Tom"] var item = arr.shift(); console.log(item); // Jack console.log(arr); // ["Sean", "Lily", "lucy", "Tom"]
4.sort()
作用:对数组内部数据进行排序(可接受函数)
用法:
var arr1 = ["a", "d", "c", "b"]; console.log(arr1.sort()); // ["a", "b", "c", "d"] arr2 = [13, 24, 51, 3]; console.log(arr2.sort()); // [13, 24, 3, 51] console.log(arr2); // [13, 24, 3, 51](元数组被改变)
上面出现的问题原因是:在排序时,sort()方法会调用每个数组项的 toString()转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值, sort()方法比较的也是字符串,因此会出现以上的这种情况;
为了解决上述问题,sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回 0,如果第一个参数应该位于第二个之后则返回一个正数。以下就是一个简单的比较函数:
function compare(value1, value2) { if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { return 0; } } arr2 = [13, 24, 51, 3]; console.log(arr2.sort(compare)); // [3, 13, 24, 51]
5.reverse()
作用:将数组内容完全反转(不接收参数)
用法:
var arr = [13, 24, 51, 3]; console.log(arr.reverse()); //[3, 51, 24, 13] console.log(arr); //[3, 51, 24, 13](原数组改变)
6.concat()
作用:将参数添加到原数组中。这个方法会先创建当前数组一个副本,然后将接收到的参数添加到这个副本的末尾,最后返回新构建的数组。在没有给 concat()方法传递参数的情况下,它只是复制当前数组并返回副本。
用法:
var arr = [1,3,5,7]; var arrCopy = arr.concat(9,[11,13]); console.log(arrCopy); //[1, 3, 5, 7, 9, 11, 13] console.log(arr); // [1, 3, 5, 7](原数组未被修改)
如果传入的是一个二维数组,那么也会把这一数组项当作一项添加到Array中
var arrCopy2 = arr.concat([9,[11,13]]); console.log(arrCopy2); //[1, 3, 5, 7, 9, Array[2]] console.log(arrCopy2[5]); //[11, 13]
7.slice()
作用:返回从原数组中指定开始下标到结束下标之间的项组成的新数组(不会改变原数组)
用法:
var arr = [1,3,5,7,9,11]; var arrCopy = arr.slice(1);//如果只写第一个参数的话,这个表示从数组第二位到数组最后一位 var arrCopy2 = arr.slice(1,4);//从数组第二位开始(包括第二位)到第四位(不包括第四位)截取数组 var arrCopy3 = arr.slice(1,-2);//复数表示从数组最后往前算,-1表示数组最后一位,这里的-2表示数组倒数第二位(负值的话,跟数组长度相加,也能是相同效果,等同于arr.slice(1,4)) var arrCopy4 = arr.slice(-4,-1); console.log(arr); //[1, 3, 5, 7, 9, 11](原数组没变) console.log(arrCopy); //[3, 5, 7, 9, 11] console.log(arrCopy2); //[3, 5, 7] console.log(arrCopy3); //[3, 5, 7] console.log(arrCopy4); //[5, 7, 9]
8.splice()
作用:很强大的数组方法,它有很多种用法,可以实现删除、插入和替换。(原数组会变化)
array.splice(index,howmany,item1,.....,itemX)
index表示数组要更正的起始位置,(必填)
howmany:表示从起始位置之后需要替换/删除的的数量,如果是0的话,不会进行删除操作;
item1,.....,itemX(选填,如果不填的话,只有前面的话,表示从index开始,进行删除,数量为howmany)如果写的话,表示在前删除操作做完之后把这些方法删除位置。进行插入替换,
用法:
var arr = [1,3,5,7,9,11]; var arrRemoved = arr.splice(0,2); console.log(arr); //[5, 7, 9, 11] 改变了原数组 console.log(arrRemoved); //[1, 3] 返回值是截取的数值组成的数组 var arrRemoved2 = arr.splice(2,0,4,6); console.log(arr); // [5, 7, 4, 6, 9, 11] 如果是0的话,会将后面的数值插入到index的前面 console.log(arrRemoved2); // [] var arrRemoved3 = arr.splice(1,1,2,4); console.log(arr); // [5, 2, 4, 4, 6, 9, 11] console.log(arrRemoved3); //[7]
9.indexOf()和latIndexOf()
作用:
indexOf():接收两个参数:要查找的项和(可选的)表示查找起点位置的索引。其中, 从数组的开头(位置 0)开始向后查找。
lastIndexOf:接收两个参数:要查找的项和(可选的)表示查找起点位置的索引。其中, 从数组的末尾开始向前查找。
这两个方法都返回要查找的项在数组中的位置,或者在没找到的情况下返回-1。(只会找到第一个匹配项)在比较第一个参数与数组中的每一项时,会使用全等操作符(类型也会进行比较的)。
用法:
var arr = [1,3,5,7,7,5,3,1]; console.log(arr.indexOf(5)); //2 console.log(arr.lastIndexOf(5)); //5 console.log(arr.indexOf(5,2)); //2 console.log(arr.indexOf(5,3)); //5 console.log(arr.indexOf(5,10)); //-1 console.log(arr.lastIndexOf(5,4)); //2 console.log(arr.indexOf("5")); //-1
10.forEach()
作用: 对数组进行遍历循环,对数组中的每一项运行给定函数。这个方法没有返回值。参数都是function类型,默认有传参,参数分别为:遍历的数组内容;内容对应的数组索引,数组本身。
用法:
var arr = [1, 2, 3, 4, 5]; arr.forEach(function(x, index, a){ console.log(x + '|' + index + '|' + (a === arr)); }); // 输出为: // 1|0|true // 2|1|true // 3|2|true // 4|3|true // 5|4|true
11.map()
作用:指“映射”,对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。
用法:
var arr = [1, 2, 3, 4, 5]; var arr2 = arr.map(function(item,index,a){//跟foreach一样的参数 return item*item; }); console.log(arr2); //[1, 4, 9, 16, 25]
有return的话,返回值会组成一个新数组,如果没有返回值的话,也会有一个同长度的新数组,不过每一项都是undifined;
跟forEach()方法类似,不过map有返回值。
12.filter()
作用::“过滤”功能,数组中的每一项运行给定函数,返回满足过滤条件组成的数组。(不改变原数组)
用法:
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; var arr2 = arr.filter(function(x, index) { return index % 3 === 0 || x >= 8; }); console.log(arr2); //[1, 4, 7, 8, 9, 10]
13.every()
作用:判断数组中每一项都是否满足条件,只有所有项都满足条件,才会返回true。(不改变原数组)
用法:
var arr = [1, 2, 3, 4, 5]; var arr2 = arr.every(function(x) { return x < 10; }); console.log(arr2); //true var arr3 = arr.every(function(x) { return x < 3; }); console.log(arr3); // false
14.some()
作用:判断数组中是否存在满足条件的项,只要有一项满足条件,就会返回true。(不改变原数组)
用法:
var arr = [1, 2, 3, 4, 5]; var arr2 = arr.some(function(x) { return x < 3; }); console.log(arr2); //true var arr3 = arr.some(function(x) { return x < 1; }); console.log(arr3); // false
15.reduce()和reduceRight()
作用:这两个方法都会实现迭代数组的所有项,然后构建一个最终返回的值。reduce()方法从数组的第一项开始,逐个遍历到最后。而 reduceRight()则从数组的最后一项开始,向前遍历到第一项。
这两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为归并基础的初始值。
传给 reduce()和 reduceRight()的函数接收 4 个参数:前一个值、当前值、项的索引和数组对象。这个函数返回的任何值都会作为第一个参数自动传给下一项。第一次迭代发生在数组的第二项上,因此第一个参数是数组的第一项,第二个参数就是数组的第二项。
下面代码用reduce()实现数组求和,数组一开始加了一个初始值10。
var values = [1,2,3,4,5]; var sum = values.reduceRight(function(prev, cur, index, array){ return prev + cur; },10);//这个10会当作循环第一次回调函数里面的prev值 console.log(sum); //25