几乎所有编程语言原生支持数组类型。数组是最简单的一种数据结构。
创建和初始化数组。使用new关键字初始化数组,进一步可以将数组元素作为参数传递给构造器。其中使用数组的length属性,能够知道数组中存了多少个元素:
var daysOfWeek = new Array(); var daysOfWeek = new Array(7); console.log(daysOfWeek.length); var daysOfWeek = new Array(‘Sunday‘, ‘Monday‘, ‘Tuesday‘, ‘Wednesday‘, ‘Thursday‘, ‘Friday‘, ‘Saturday‘);
除此之外,也可以用[ ]指定即可,不加new关键字,利用for循环打印出数组里的每一个元素:
var daysOfWeek = []; var daysOfWeek = [‘Sunday‘, ‘Monday‘, ‘Tuesday‘, ‘Wednesday‘, ‘Thursday‘, ‘Friday‘, ‘Saturday‘]; for (var i=0; i<daysOfWeek.length; i++){ console.log(daysOfWeek[i]); }
举个斐波那契(fibonacci)数列前20个数的栗子:
var fibonacci = []; fibonacci[1] = 1; fibonacci[2] = 1; for(var i = 3; i < 20; i++){ fibonacci[i] = fibonacci[i-1] + fibonacci[i-2]; } for(var i = 1; i<fibonacci.length; i++){ console.log(fibonacci[i]); } //or simply print with the array name console.log(fibonacci);
添加和删除元素的方式:
var numbers = [0,1,2,3,4,5,6,7,8,9]; //add a new element to the numbers array numbers[numbers.length] = 10;
在JavaScript当中,数组是可修改的对象。添加元素时,它会动态增长。这一点与C语言大为不同。
也可以用push方法,将元素添加到数组的末尾。如果插入的元素不在末尾而是在数组的开头,则将数组内的元素全部右移一位。
numbers.push(11); numbers.push(12, 13);
//insert first position manually for (var i=numbers.length; i>=0; i--){ numbers[i] = numbers[i-1]; } numbers[0] = -1;
也可以使用unshift方法直接在首部添加元素。
numbers.unshift(-2); numbers.unshift(-4, -3);
就可以按照-4,-3,-2的顺序将这些元素依次插入到数组的首部。
删除数组元素
pop方法删除最靠后的元素。
numbers.pop();
如果是删除(覆盖)第一个元素,则按照向左移动一位的方法实现,数组的长度和之前是一样的,并且多了一个未定义(undefined)的元素。
for (var i=0; i<numbers.length-1; i++){//pay attention to the (length-1) for avoiding the overflow numbers[i] = numbers[i+1]; }
或者可以用shift方式实现对第一个元素的删除
numbers.shift();
或者可以用splice方法实现对指定索引处、指定数量的元素的删除。
numbers.splice(5,3); numbers.splice(5,0,2,3,4);//from index 5 ,add 3 numbers numbers.splice(5,3,2,3,4);//from index 5 ,delete then add 3 numbers
多维数组,或者矩阵的存储结构。
averageTemp[0] = []; averageTemp[0][0] = 72; averageTemp[0][1] = 75; averageTemp[0][2] = 79; averageTemp[0][3] = 79; averageTemp[0][4] = 81; averageTemp[0][5] = 81; //day 2 averageTemp[1] = []; averageTemp[1][0] = 81; averageTemp[1][1] = 79; averageTemp[1][2] = 75; averageTemp[1][3] = 75; averageTemp[1][4] = 73; averageTemp[1][5] = 72;
然后可以用循环嵌套的方式进行这些数据的检索。
function printMatrix(myMatrix) { for (var i=0; i<myMatrix.length; i++){ for (var j=0; j<myMatrix[i].length; j++){ console.log(myMatrix[i][j]); } } } printMatrix(averageTemp);
再增加一维也没有关系。
var matrix3x3x3 = []; for (var i=0; i<3; i++){ matrix3x3x3[i] = []; for (var j=0; j<3; j++){ matrix3x3x3[i][j] = []; for (var z=0; z<3; z++){ matrix3x3x3[i][j][z] = i+j+z; } } } for (var i=0; i<matrix3x3x3.length; i++){ for (var j=0; j<matrix3x3x3[i].length; j++){ for (var z=0; z<matrix3x3x3[i][j].length; z++){ console.log(matrix3x3x3[i][j][z]); } } }
数组合并
concat方法
var zero = 0; var positiveNumbers = [1,2,3]; var negativeNumbers = [-3,-2,-1]; var numbers = negativeNumbers.concat(zero, positiveNumbers); console.log(numbers);
这样就不必迭代每个数组中的元素。因为concat方法可以向一个数组传递数组、对象或者元素。数组将会按照该方法接收的参数的顺序连接指定的数组。
迭代器函数,reduce方法停止执行后,会返回一个累加器。
console.log(numbers.reduce(function(previous, current, index){ return previous + current; }));
some,every,forEach方法
var isEven = function (x) { // returns true if x is a multiple of 2. console.log(x); return (x % 2 == 0) ? true : false; }; var numbers = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]; numbers.every(isEven); //is going to execute the function only once console.log(‘---‘); numbers.some(isEven); //is going to execute the function twice numbers.forEach(function(x){ console.log((x % 2 == 0)); });
map,filter方法,返回的都是数组。
var myMap = numbers.map(isEven); var evenNumbers = numbers.filter(isEven);
搜索和排序
numbers.sort(function(a,b){return a-b;});//按照升序排列,以function作为参数传入sort [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
console.log(numbers.indexOf(10)); console.log(numbers.indexOf(100)); numbers.push(10); console.log(numbers.lastIndexOf(10)); console.log(numbers.lastIndexOf(100));
indexOf,lastIndexOf分别返回与参数匹配的第一个元素的索引,以及与参数匹配的最后一个元素的索引。
输出数组为字符串
console.log(numbers.toString()); var numbersString = numbers.join(‘-‘); console.log(numbersString);
原文:http://my.oschina.net/donngchao/blog/524651