1.使用数组
1.1 创建数组
(1)
var numbers = [];
var numbers = [1,2,3,4,5];
(2)
可以调用 Array 的构造函数创建数组:var numbers = new Array();
同样,可以为构造函数传入一组元素作为数组的初始值:var numbers = new Array(1,2,3,4,5);
(在调用 Array 的构造函数时,可以只传入一个参数,用来指定数组的长度:var numbers = new Array(10);)
note1:数组中的元素不必是同一种数据类型var objects = [1, "Joe", true, null];
note2:可以调用 Array.isArray() 来判断一个对象是否是数组,如下所示:
var numbers = 3;
var arr = [7,4,1776];
print(Array.isArray(numbers)); // 显示 false
print(Array.isArray(arr)); // 显示 true
1.2 读写数组
略
1.3 字符串生成数组
字符串对象的 split() 方法也可以生成数组。该方法通过一些常见的分隔符,比如分隔单词的空格,将一个字符串分成几部分,并将每部分作为一个元素保存于一个新建的数组中
var sentence = "the quick brown fox jumped over the lazy dog";
var words = sentence.split(" ");
for (var i = 0; i < words.length; ++i) {
print("word " + i + ": " + words[i]);
}
word 0: the
word 1: quick
word 2: brown
word 3: fox
word 4: jumped
word 5: over
word 6: the
word 7: lazy
word 8: dog
1.4 对数组的整体操作
(1)浅复制
var nums = [];
for (var i = 0; i < 100; ++i) {
nums[i] = i+1;
}
var samenums = nums;
nums[0] = 400;
print(samenums[0]); // 显示 400
把一个数组赋给另外一个数组时,只是为被赋值的数组增加了一个新的引用。当通过原引用修改了数组的值,另外一个引用也会感知到这个变化,新数组依然指向原来的数组
(2)深复制
function copy(arr1, arr2) {
for (var i = 0; i < arr1.length; ++i) {
arr2[i] = arr1[i];
}
}
这样,下述代码片段的输出就和我们希望的一样了:
var nums = [];
for (var i = 0; i < 100; ++i) {
nums[i] = i+1;
}
var samenums = [];
copy(nums, samenums);
nums[0] = 400;
print(samenums[0]); // 显示 1
深复制,将原数组中的每一个元素都复制一份到新数组中
2.存取函数
2.1 查找元素
indexOf用来查找传进来的参数在目标数组中是否存在。如果目标数组包含该参数,就返回该元素在数组中的索引;如果不包含,就返回 -1
var names = ["David", "Cynthia", "Raymond", "Clayton", "Jennifer"];
putstr("Enter a name to search for: ");
var name = readline();
var position = names.indexOf(name);
if (position >= 0) {
print("Found " + name + " at position " + position);
}
else {
print(name + " not found in array.");
}
执行该程序,并且输入 Cynthia,输出为:
Found Cynthia at position 1
2.2 数组的字符串表示
有两个方法可以将数组转化为字符串:join() 和 toString()。这两个方法都返回一个包含数组所有元素的字符串,各元素之间用逗号分隔开
var names = ["David", "Cynthia", "Raymond", "Clayton", "Mike", "Jennifer"];
var namestr = names.join();
print(namestr); // David,Cynthia,Raymond,Clayton,Mike,Jennifer
namestr = names.toString();
print(namestr); // David,Cynthia,Raymond,Clayton,Mike,Jennifer
事实上,当直接对一个数组使用 print() 函数时,系统会自动调用那个数组的 toString()
print(names); // David,Cynthia,Raymond,Clayton,Mike,Jennifer
2.3 由已有数组创建新数组
concat() 和 splice() 方法允许通过已有数组创建新数组。concat 方法可以合并多个数组
创建一个新数组,splice() 方法截取一个数组的子集创建一个新数组
var cisDept = ["Mike", "Clayton", "Terrill", "Danny", "Jennifer"];
var dmpDept = ["Raymond", "Cynthia", "Bryan"];
var itDiv = cis.concat(dmp);
print(itDiv);
itDiv = dmp.concat(cisDept);
print(itDiv);
输出为:
Mike,Clayton,Terrill,Danny,Jennifer,Raymond,Cynthia,Bryan
var itDiv = ["Mike","Clayton","Terrill","Raymond","Cynthia","Danny","Jennifer"];
var dmpDept = itDiv.splice(3,3);
var cisDept = itDiv;
print(dmpDept); // Raymond,Cynthia,Danny
print(cisDept); // Mike,Clayton,Terrill,Jennifer
3. 可变函数
3.1 为数组添加元素
push() 方法会将一个元素添加到数组末尾:
var nums = [1,2,3,4,5];
print(nums); // 1,2,3,4,5
nums.push(6);
print(nums); // 1,2,3,4,5,6
unshift() 方法可以将元素添加在数组的开头,下述代码展示了该方法的用法:
var nums = [2,3,4,5];
print(nums); // 2,3,4,5
var newnum = 1;
nums.unshift(newnum);
print(nums); // 1,2,3,4,5
nums = [3,4,5];
nums.unshift(newnum,1,2);
print(nums); // 1,2,3,4,5
3.2 从数组首尾删除元素
使用 pop() 方法可以删除数组末尾的元素:
var nums = [1,2,3,4,5,9];
nums.pop();
print(nums); // 1,2,3,4,5
shift() 方法可以删除数组的第一个元素,下述代码展示了该方法的用法:
var nums = [9,1,2,3,4,5];
nums.shift();
print(nums); // 1,2,3,4,5
3.3 从数组中间位置添加和删除元素
使用 splice() 方法为数组添加元素,需提供如下参数:
• 起始索引(也就是你希望开始添加元素的地方);
• 需要删除的元素个数(添加元素时该参数设为 0);
• 想要添加进数组的元素。
var nums = [1,2,3,7,8,9];
var newElements = [4,5,6];
nums.splice(3,0,newElements);/nums.splice(3,0,4,5,6);
print(nums); // 1,2,3,4,5,6,7,8,9
var nums = [1,2,3,100,200,300,400,4,5];
nums.splice(3,4);
print(nums); // 1,2,3,4,5
3.4 为数组排序
reverse(),该方法将数组中元素的顺序进行翻转
var nums = [1,2,3,4,5];
nums.reverse();
print(nums); // 5,4,3,2,1
如果元素是字符串类型,那么数组的可变方法sort() 就非常好使:
var names = ["David","Mike","Cynthia","Clayton","Bryan","Raymond"];
names.sort();
print(names); // Bryan,Clayton,Cynthia,David,Mike,Raymond
sort() 方法是按照字典顺序对元素进行排序的,因此它假定元素都是字符串类型,在上一个例子中,即使元素是数字类型,也被认为是字符串类型。为了让 sort() 方法也能排序数字类型的元素,可以在调用方法时传入一个大小比较函数,排序时,sort() 方法将会根据该函数比较数组中两个元素的大小,从而决定整个数组的顺序。
function compare(num1, num2) {
return num1 - num2;
}
var nums = [3,1,2,100,4,200];
nums.sort(compare);
print(nums); // 1,2,3,4,100,200
4.迭代器方法
对数组中的每个元素应用一个函数,可以返回一个值、一组值或者一个新数组
4.1 不生成新数组的迭代器方法
(1)forEach(),该方法接受一个函数作为参数,对数组中的每个元素使用该函数
function square(num) {
print(num, num * num);
}
var nums = [1,2,3,4,5,6,7,8,9,10];
nums.forEach(square);
该程序的输出为:
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
10 100
(2)every,该方法接受一个返回值为布尔类型的函数,对数组中的每个元素使用该函数。如果对于所有的元素,该函数均返回 true,则该方法返回 true
function isEven(num) {
return num % 2 == 0;
}
var nums = [2,4,6,8,10];
var even = nums.every(isEven);
if (even) {
print("all numbers are even");
}
else {
print("not all numbers are even");
}
输出为:
all numbers are even
将数组改为:
var nums = [2,4,6,7,8,10];
输出为:
not all numbers are even
(3)some() 方法也接受一个返回值为布尔类型的函数,只要有一个元素使得该函数返回 true,该方法就返回 true
function isEven(num) {
return num % 2 == 0;
}
var nums = [1,2,3,4,5,6,7,8,9,10];
var someEven = nums.some(isEven);
if (someEven) {
print("some numbers are even");
}
else {
print("no numbers are even");
}
nums = [1,3,5,7,9];
someEven = nums.some(isEven);
if (someEven) {
print("some numbers are even");
}
else {
print("no numbers are even");
}
该程序的输出为:
some numbers are even
no numbers are even
(4)reduce() 方法接受一个函数,返回一个值。该方法会从一个累加值开始,不断对累加值和数组中的后续元素调用该函数,直到数组中的最后一个元素,最后返回得到的累加值
function add(runningTotal, currentValue) {
return runningTotal + currentValue;
}
var nums = [1,2,3,4,5,6,7,8,9,10];
var sum = nums.reduce(add);
print(sum); // 显示 55
reduce() 方法也可以用来将数组中的元素连接成一个长的字符串:
function concat(accumulatedString, item) {
return accumulatedString + item;
}
var words = ["the ", "quick ","brown ", "fox "];
var sentence = words.reduce(concat);
print(sentence); // 显示 "the quick brown fox"
reduceRight() 方法,和 reduce() 方法不同,它是从右到左执行
function concat(accumulatedString, item) {
return accumulatedString + item;
}
var words = ["the ", "quick ","brown ", "fox "];
var sentence = words.reduceRight(concat);
print(sentence); // 显示 "fox brown quick the"
4.2 生成新数组的迭代器方法
有两个迭代器方法可以产生新数组:map() 和 filter()。
(1) map() 和 forEach() 有点儿像,对数组中的每个元素使用某个函数。两者的区别是 map() 返回一个新的数组,该数组的元素是对原有元素应用某个函数得到的结果
function curve(grade) {
return grade += 5;
}
var grades = [77, 65, 81, 92, 83];
var newgrades = grades.map(curve);
print(newgrades); // 82, 70, 86, 97, 88
function first(word) {
return word[0];
}
var words = ["for","your","information"];
var acronym = words.map(first);
print(acronym.join("")); // 显示 "fyi"
(数组 acronym 保存了数组 words 中每个元素的第一个字母。然而,如果想将数组显示为真正的缩略形式,必须想办法除掉连接每个数组元素的逗号,如果直接调用 toString() 方法,就会显示出这个逗号。使用 join() 方法,为其传入一个空字符串作为参数,则可以帮助我们解决这个问题)
(2)filter() 和 every() 类似,传入一个返回值为布尔类型的函数。和 every() 方法不同的是,当对数组中的所有元素应用该函数,结果均为 true 时,该方法并不返回 true,而是返回一个新数组,该数组包含应用该函数后结果为 true 的元素
function isEven(num) {
return num % 2 == 0;
}
function isOdd(num) {
return num % 2 != 0;
}
var nums = [];
for (var i = 0; i < 20; ++i) {
nums[i] = i+1;
}
var evens = nums.filter(isEven);
print("Even numbers: ");
print(evens);
var odds = nums.filter(isOdd);
print("Odd numbers: ");
print(odds);
该程序的执行结果如下:
Even numbers:
2,4,6,8,10,12,14,16,18,20
Odd numbers:
1,3,5,7,9,11,13,15,17,19
5.二维和多维数组
5.1 创建二维数组
(1)
var grades = [[89, 77, 78],[76, 82, 81],[91, 94, 89]];
print(grades[2][2]); // 显示 89
(2)
Array.matrix = function(numrows, numcols, initial) {
var arr = [];
for (var i = 0; i < numrows; ++i) {
var columns = [];
for (var j = 0; j < numcols; ++j) {
columns[j] = initial;
}
arr[i] = columns;
}
return arr;
}
下面是测试该方法的一些测试代码:
var nums = Array.matrix(5,5,0);
print(nums[1][1]); // 显示 0
var names = Array.matrix(3,3,"");
names[1][2] = "Joe";
print(names[1][2]); // display"Joe"
5.2 处理二维数组的元素
处理二维数组中的元素,有两种最基本的方式:按列访问和按行访问
var grades = [[89, 77, 78],[76, 82, 81],[91, 94, 89]];
var total = 0;
var average = 0.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;
print("Student " + parseInt(row+1) + " average: " +
average.toFixed(2));
total = 0;
average = 0.0;
}
Student 1 average: 81.33
Student 2 average: 79.67
Student 3 average: 91.33