十二:数组、多维数组和符合数组(哈希映射)
最后更新于:2022-04-01 20:32:16
Array(数组)是JavaScript中较为复杂的数据类型,同Java、C#、VB等程序语言的数组相比,Javascript数组中的元素不必为相同的数据类型,可以在数组每个元素上混合使用数字、日期、字符串、Object,甚至添加一个嵌套数组。
## 一、创建数组
1、var arr1 = new Array(); /var arr2 = new Array(length); /var arr3 = new Array(element1,element2...);
var arr4 = [element1,element2,...]; length是一个指定数组长度的整数。element是一系列任意值。
2、变长数组:JavaScript的数组长度可以任意扩展。
~~~
var arr = new Array(2);
arr[0] = "Jan";
arr[1] = "Feb";
arr[2] = "Mar";
alert(arr.length); //输出3
~~~
3、元素可以为空
~~~
var arr = new Array();
arr[0] = "Jan";
arr[2] = "Mar";
alert(arr.length); //输出3
alert(arr[1]); //undefined
~~~
但是document.write(arr);将输出:Jan,,Mar
4、使用Array()时的注意事项:不能将另外一个数组作为参数传递给该函数,否则是创建了一个仅有一个元素的复合数组
~~~
var arr1 = ['a','b','c'];
var arr2 = new Array(arr1);
document.write(arr2+"
"); document.write(arr2[0]+"
"); document.write(arr2[1]+"
"); document.write(arr2[0] === arr1); ~~~ 结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec7b4f3b.jpg) 但是使用Object()则不然,它创建了一个对象的副本。 ~~~ var obj = {a:1,b:2,c:3}; var obj2 = new Object(obj); document.write(obj2+"
"); document.write(obj2.a+"
"); document.write(obj === obj2); ~~~ 结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec7c9d93.jpg) ## 二、实现和使用多维数组 在Javascript中不可以直接声明多维数组,但是可以将数组嵌套实现多维数组。 ~~~ var multiArr = new Array(new Array("one","two"),new Array(1,2)); document.write(multiArr+"
"); document.write(multiArr[0]+"
"); document.write(multiArr[1][0]+"
"); document.write("循环输出数组元素:
"); for(var i = 0; i < multiArr.length; i++) { for(var j = 0; j < multiArr[i].length;j++) { document.write(multiArr[i][j]+"
"); } } ~~~ 结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec7df4e6.jpg) ## 三、使用Array API处理数组 1、Array类的常见方法和属性: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec7f402f.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec81eeb1.jpg) 2、Array类的静态属性: CASEINSENSITIVE :在排序中,此常数指定不区分大小写。 DESCENDING:在排序中,此常数指定降序排序。 NUMERIC:在排序中,此常数指定数字(不是字符串)排序。 RETURNINDEXEDARRAY:指定排序返回索引 UNIQUESORT:在排序方法中,此常数指定唯一的排序要求。 3、示例 ~~~ var arr = new Array("Jody"); document.write("原数组:"+arr+"
"); arr.push("Mary"); //新增一个元素 document.write("新增一个元素:"+arr.toString()+"
"); arr.push("Marcell"); document.write(arr.toString()+"
"); arr.shift(); //删除第一个元素 document.write("删除第一个元素:"+arr.toString()+"
"); arr.reverse(); //反转元素 document.write("反转元素:"+arr.toString()+"
"); var arr1 = ["Judy","Jody"]; var arr3 = arr1.concat(arr); //两个数组相连创建一个新数组 document.write("两个数组相连创建一个新数组:"+arr3.toString()+"
"); document.write("join()方法:"+arr3.join("-")+"
"); var arr4 = arr3.slice(0,2); document.write("slice()方法返回子数组:"+arr4.join("-")+"
"); document.write("splice()方法删除元素:"+arr3.splice(0,2)+"
"); ~~~ 结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec835aa7.jpg) ## 四:ECMAScript 5 新增的方法(在IE中,只有IE9支持) 1、every(callbackFunction[,thisObject]):对数组的每一项执行测试函数,直到获得对指定的函数返回false的项。 callbackFunction为定义的函数名,该函数有元素值、元素索引和Array对象三个参数;thisObject可选,是函数的this对象。 2、filter(callbackFunction[,thisObject]):对数组的每一项执行测试函数,根据函数结果构造一个新数组。所有数组元素对指定函数返回TRUE,则新数组中包含此元素,反之,不包含。 3、forEach(callbackFunction[,thisObject]):对数组中的每一项执行回调函数。参数同every()函数。 4、indexOf(seachElement[,fromIndex]):使用“===”运算符搜索数组中的项,并返回该值索引位置。seachElement是查找项,若没有找到则返回-1;fromIndex是查找的起始位置。 5、Array.isArray(objArr):静态方法,判断指定的参数是否为数组。 6、lastIndexOf(seachElement[,fromIndex]):使用“===”运算符搜索数组中的项(从最后一项向前搜索),并返回该值索引位置。语法同indexOf()方法。 7、map(callbackFunction[,thisObject]):对数组的每一项执行测试函数,根据函数结果构造一个新数组,其中包含与原始数组中的每一项的函数结果对应的项。参数语义同every()函数。 8、reduce(callbackFunction[,initialValue]):从左到右,使用函数比较数组中的两个值,将两个值删除一个。callbackFunction是自定义的函数,包含前一个元素值、当前元素值、当前元素索引和Array对象。initialValue是第一次调用callbackFunction函数时的previous值(前一个元素值)。若不定义,第一次调用callbackFunction时前一个元素值是第一个元素值,当前值是第二个元素值;若定义了,则当前值是第一个元素值。 9、refuceRight(callbackFunction[,initialValue]):从右到左,使用函数比较数组中的两个值,将两个值删除一个。参数语义同reduce()。 10、some(callbackFunction[,thisObject]):对数组中的每一项执行测试函数,直到返回true的项。 ## 五、数组的排序: sort([sortfunction]):用于对数组进行排序,sortfunction可选,用来定义数组元素排序的函数,若省略,元素按照ASCII字符顺序进行升序排列,意味着不能对中文排序。 1、默认的排序规则 1.1 排序区分大小写,大写优先于小写(Z优先于a) 1.2 按升序排序(a优先于b) 1.3 数字字段按字符串形式排序,所以100优先于99,因为1的字符串值比9低。 2、自定义排序:定义sortfunction参数 2.1 函数返回 -1表示传递的第一个参数比第二个参数小 2.2 函数返回 0表示传递的第一个参数等于第二个参数 2.3 函数返回 1表示传递的第一个参数比第二个参数大 ~~~ var arr = new Array("Tom","Tommy","John"); //按照ASCII顺序升序排列 arr.sort(); document.write("按照ASCII顺序升序排列:"+arr+"
"); var sortFun = function(a,b) { if(a.length < b.length) return -1; if(a.length > b.length) return 1; if(a.length == b.length) return 0; } arr.sort(sortFun); document.write("按照自定义顺序排列:"+arr+"
"); ~~~ 结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec8488e6.jpg) ## 六、创建和使用复合数组:在Javascript中可以使用Object和Array对象创建复合数组 1、使用Object对象创建 var per = {sex:"male",age:28,birth:new Date(1980,7,5)}; document.write(per.sex) <=> document.write(per['sex']) ;//类似于创建Javascript对象 2、使用Array对象创建 var per = new Array(); per['sex'] = "male"; per['age'] = 28; per['birth'] = new Date(1980,7,5); 以下方法则是错误的: var per = [sex:"male",age:28,birth:new Date(1980,7,5)]; 3、遍历复合数组 ~~~ var per = new Array(); per['sex'] = "male"; per['age'] = 28; per['birth'] = new Date(1980,7,5); for(var i in per) { document.write(i+" : "+per[i]+"
"); } ~~~ 结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec85b659.jpg)
';
"); document.write(arr2[0]+"
"); document.write(arr2[1]+"
"); document.write(arr2[0] === arr1); ~~~ 结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec7b4f3b.jpg) 但是使用Object()则不然,它创建了一个对象的副本。 ~~~ var obj = {a:1,b:2,c:3}; var obj2 = new Object(obj); document.write(obj2+"
"); document.write(obj2.a+"
"); document.write(obj === obj2); ~~~ 结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec7c9d93.jpg) ## 二、实现和使用多维数组 在Javascript中不可以直接声明多维数组,但是可以将数组嵌套实现多维数组。 ~~~ var multiArr = new Array(new Array("one","two"),new Array(1,2)); document.write(multiArr+"
"); document.write(multiArr[0]+"
"); document.write(multiArr[1][0]+"
"); document.write("循环输出数组元素:
"); for(var i = 0; i < multiArr.length; i++) { for(var j = 0; j < multiArr[i].length;j++) { document.write(multiArr[i][j]+"
"); } } ~~~ 结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec7df4e6.jpg) ## 三、使用Array API处理数组 1、Array类的常见方法和属性: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec7f402f.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec81eeb1.jpg) 2、Array类的静态属性: CASEINSENSITIVE :在排序中,此常数指定不区分大小写。 DESCENDING:在排序中,此常数指定降序排序。 NUMERIC:在排序中,此常数指定数字(不是字符串)排序。 RETURNINDEXEDARRAY:指定排序返回索引 UNIQUESORT:在排序方法中,此常数指定唯一的排序要求。 3、示例 ~~~ var arr = new Array("Jody"); document.write("原数组:"+arr+"
"); arr.push("Mary"); //新增一个元素 document.write("新增一个元素:"+arr.toString()+"
"); arr.push("Marcell"); document.write(arr.toString()+"
"); arr.shift(); //删除第一个元素 document.write("删除第一个元素:"+arr.toString()+"
"); arr.reverse(); //反转元素 document.write("反转元素:"+arr.toString()+"
"); var arr1 = ["Judy","Jody"]; var arr3 = arr1.concat(arr); //两个数组相连创建一个新数组 document.write("两个数组相连创建一个新数组:"+arr3.toString()+"
"); document.write("join()方法:"+arr3.join("-")+"
"); var arr4 = arr3.slice(0,2); document.write("slice()方法返回子数组:"+arr4.join("-")+"
"); document.write("splice()方法删除元素:"+arr3.splice(0,2)+"
"); ~~~ 结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec835aa7.jpg) ## 四:ECMAScript 5 新增的方法(在IE中,只有IE9支持) 1、every(callbackFunction[,thisObject]):对数组的每一项执行测试函数,直到获得对指定的函数返回false的项。 callbackFunction为定义的函数名,该函数有元素值、元素索引和Array对象三个参数;thisObject可选,是函数的this对象。 2、filter(callbackFunction[,thisObject]):对数组的每一项执行测试函数,根据函数结果构造一个新数组。所有数组元素对指定函数返回TRUE,则新数组中包含此元素,反之,不包含。 3、forEach(callbackFunction[,thisObject]):对数组中的每一项执行回调函数。参数同every()函数。 4、indexOf(seachElement[,fromIndex]):使用“===”运算符搜索数组中的项,并返回该值索引位置。seachElement是查找项,若没有找到则返回-1;fromIndex是查找的起始位置。 5、Array.isArray(objArr):静态方法,判断指定的参数是否为数组。 6、lastIndexOf(seachElement[,fromIndex]):使用“===”运算符搜索数组中的项(从最后一项向前搜索),并返回该值索引位置。语法同indexOf()方法。 7、map(callbackFunction[,thisObject]):对数组的每一项执行测试函数,根据函数结果构造一个新数组,其中包含与原始数组中的每一项的函数结果对应的项。参数语义同every()函数。 8、reduce(callbackFunction[,initialValue]):从左到右,使用函数比较数组中的两个值,将两个值删除一个。callbackFunction是自定义的函数,包含前一个元素值、当前元素值、当前元素索引和Array对象。initialValue是第一次调用callbackFunction函数时的previous值(前一个元素值)。若不定义,第一次调用callbackFunction时前一个元素值是第一个元素值,当前值是第二个元素值;若定义了,则当前值是第一个元素值。 9、refuceRight(callbackFunction[,initialValue]):从右到左,使用函数比较数组中的两个值,将两个值删除一个。参数语义同reduce()。 10、some(callbackFunction[,thisObject]):对数组中的每一项执行测试函数,直到返回true的项。 ## 五、数组的排序: sort([sortfunction]):用于对数组进行排序,sortfunction可选,用来定义数组元素排序的函数,若省略,元素按照ASCII字符顺序进行升序排列,意味着不能对中文排序。 1、默认的排序规则 1.1 排序区分大小写,大写优先于小写(Z优先于a) 1.2 按升序排序(a优先于b) 1.3 数字字段按字符串形式排序,所以100优先于99,因为1的字符串值比9低。 2、自定义排序:定义sortfunction参数 2.1 函数返回 -1表示传递的第一个参数比第二个参数小 2.2 函数返回 0表示传递的第一个参数等于第二个参数 2.3 函数返回 1表示传递的第一个参数比第二个参数大 ~~~ var arr = new Array("Tom","Tommy","John"); //按照ASCII顺序升序排列 arr.sort(); document.write("按照ASCII顺序升序排列:"+arr+"
"); var sortFun = function(a,b) { if(a.length < b.length) return -1; if(a.length > b.length) return 1; if(a.length == b.length) return 0; } arr.sort(sortFun); document.write("按照自定义顺序排列:"+arr+"
"); ~~~ 结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec8488e6.jpg) ## 六、创建和使用复合数组:在Javascript中可以使用Object和Array对象创建复合数组 1、使用Object对象创建 var per = {sex:"male",age:28,birth:new Date(1980,7,5)}; document.write(per.sex) <=> document.write(per['sex']) ;//类似于创建Javascript对象 2、使用Array对象创建 var per = new Array(); per['sex'] = "male"; per['age'] = 28; per['birth'] = new Date(1980,7,5); 以下方法则是错误的: var per = [sex:"male",age:28,birth:new Date(1980,7,5)]; 3、遍历复合数组 ~~~ var per = new Array(); per['sex'] = "male"; per['age'] = 28; per['birth'] = new Date(1980,7,5); for(var i in per) { document.write(i+" : "+per[i]+"
"); } ~~~ 结果: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-08-30_57c54ec85b659.jpg)