数组是计算机编程中最常见的数据结构,是编程语言中的一种内建类型,效率很高。
数组的标准定义是:一个存储元素的线性集合,可以通过索引来任意存取,是一种特殊的对象;
谨记:
- 在js中,数组是一种特殊的对象,所以js中的数组效率不如其它语言中的效率高!
在js中,数组的键的类型可以是字符串,但是length属性不能正确显示长度了。
在js中创建数组的方式有很多种
// 使用[]操作符声明数组
var nums = [];
// 使用Array构造函数声明数组
var nums = new Array();
注:以上两种方式,专家推荐使用[]操作符,效率较高
- 数组的整体操作(数组的复制)
// 浅复制,为_nums增加了一个新的引用,此时改变nums,_nums对应的索引位置的值也会改变;
var nums = [1, 2, 3];
var _nums = nums;
// 深复制
function copy(num1, num2) {
var i;
for(i = 0; i < num1.length; ++i) {
num2[i] = num1[i];
}
}
数组存取
indexof(name)
如果查找的元素在数组中,则只能返回数组中的第一个匹配的值,如果不在数组中,返回-1;lastIndexof(name)
同上,返回最后一个拼配的值;
数组中的值转化成字符串
join()
toString()
使用以上方法将数组转换成以逗号分隔开字符;
由已有数组创建新数组
concat()
和splice()
方法允许通过已有数组创建新数组;concat([])
方法可以合并多个数组常见一个新数组;splice(起始索引, 截取长度)
方法截取一个数组的子集创建一个新数组;
改变数组内容
push()
将元素添加到数组末尾;unshift
将元素添加到数组开头;pop()
删除数组第一个元素;shift()
删除数组最后一个元素;splice(起始索引,删除元素个数,添加元素)
将元素添加到想要添加到地方
数组排序
reverse()
将数组中的元素顺序进行反转sort()
为数组元素是字符串的数组排序;sort(compare)
为数组元素是数字类型进行排序
function compare(a, b) { return a - b; }
不生成新数组的迭代方法
forEach(callback)
every(callback)
接受一个返回值是布尔类型的函数,对所有元素执行此callback函数,该函数均返回true
则该方法返回true
some(callback)
接受一个返回值是布尔类型的函数,只要一个元素是的此函数返回true
, 此方法返回true
;reduce(add)
将数组中的元素进行累加计算
生成新数组的迭代方法
对数组中所有元素应用map()
filter()
方法,返回一个新数组;map(callback)
与forEach()
相似,区别是map()
返回一个新的数组,该数组是对元素应用某个函数得到的结果filter(callback)
与every()
方法相似,区别是所有均返回true
时,该方法返回新数组,filter()
函数可以对字符串数组进行过滤;
var nums = [1, 2, 3];
console.log(nums.reduce(add)); // 6
function add(a, b) {
return a + b;
}
- 创建二维数组
var nums = Array.matrix(2, 3, 0)
//[[0, 0, 0], [0, 0, 0]]
- 处理二维数组
处理二维数组一般有两种方法:按列排序和按行排序。两种排序方式均使用一组嵌套的for
循环,外层循环对应行,内层循环对应列。
// 按行访问
var grades = [[89, 77, 78], [76, 82, 81], [91, 94, 89]];
var total = 0;
var average = 0;
for (var row = 0; row < grades.length; ++row) {
for (var col = 0; col < grades[row].length; ++col) {
total += grades[row][col];
}
average = total / grades[row].length;e
print("student " + parseInt(row + 1) + " average: " + average.toFiexed(2));
total = 0;
average = 0.0;
}
// 按列访问
var grades = [[89, 77, 78], [76, 82, 81], [91, 94, 89]];
var total = 0;
var average = 0;
for (var col = 0; col < grades.length; ++col) {
for(var row = 0; row < grades[col].length; ++row) {
total += grades[row][col];
}
average = total / grades[col].length;
print("test " + parseInt(col + 1) + " average: " + average.toFiexed(2));
total = 0;
average = 0.0;
}