Javascript 中的数组array是一种特殊的对象,数组下标可以视为对象的属性名称,注意js内部会将数组下标整数转换为字符以统一表示对象。
数组对应类名称为Array,它包含了许多属性和函数方便用户使用。其中包括查询、排序等常见操作。
创建数组
- 使用方括号 [ ] 操作符
var numbers1 = [];
print(numbers1.length); // 输出长度为0
var numbers2 = [1,2,3,4];
print(numbers2.length); // 输出长度为4
- 使用构造函数Array()
var numbers3 = new Array();
print(numbers3.length); // 输出长度为0
var numbers4 = new Array(1,2,3,4,5);
print(numbers4.length); // 输出长度为5
var numbers5 = new Array(10);
print(numbers5.length); // 输出长度为10
注意构造函数参数多个时表示数组元素,一个参数时表示数组长度。
- 和许多脚本语言一样,数组元素不必是同种类型
var objects = [1, "jessica", true, null];
// 使用 Array.isArray()判断对象是否数组
var n = 1;
var nums = [1,2,5];
print(Array.isArray(n)); // 输出false
print(Array.isArray(nums)); // 输出true
一些js专家建议尽量使用 [ ] 来创建数组,因为它更加高效。
- 从String创建数组
var sentence = "The world is flat with Internet";
var words = sentence.split(" ");
for (var i = 0; i < words.length; i++) {
print("word " + i + ": " + words[i]);
}
读取和写入数组元素
- 可以使用 [ ] 运算符,注意js数组长度由系统自动管理,不需要预先申请,元素默认值为null
var nums = [ ];
for (var i = 0; i < 10; ++i) {
nums[i] = i+1;
}
var sum = nums[0] + nums[5] + nums[9]
print(sum); // 输出16
// 累加所有元素
sum = 0;
for (var i = 0; i < nums.length; ++i) {
sum += nums[i];
}
print(sum); // 输出55
- js数组之间可以直接赋值(使用=),但注意赋值内容为引用(相当于C语言指针),对新数组内容的更改会反映到旧数组上
var nums = [ ];
for (var i = 0; i < 100; ++i) {
nums[i] = i+1;
}
var nums2 = nums;
nums2[0] = -100;
print(nums[0]); // 输出-100
- 查找数组元素
var names = ["David", "Cynthia", "Jennifer", "Cynthia"];
print("Enter a name to search for:");
var name = readline();
var pos = names.indexOf(name);
if (pos >= 0) {
print("Found " + name + " at position " + position);
}
else {
print(name + " not found in array.");
}
var lastpos = names.lastIndexOf("Cynthia");
print(lastpos); // 输出3
indexOf 返回数组下标,未找到时返回-1,如果有多个匹配,返回第一个下标,lastIndexOf从后向前查找,返回下标,未找到时返回-1
- 数组转换未字符串
var names = ["David", "Cynthia", "Jennifer", "Cynthia"];
var namestr = names.join();
print(namestr); // 输出 David,Cynthia,Jennifer,Cynthia
namestr = names.join(";
namestr = names.toString();
print(namestr); // 输出 David,Cynthia,Jennifer,Cynthia
print(names); // 输出 David,Cynthia,Jennifer,Cynthia
join方法默认使用逗号连接所有数组元素,toString方法也使用逗号连接数组元素,print会自动调用toString方法
- 从已有数组产生新数组
var names1 = ["David", "Cynthia", "Jennifer"];
var names2 = ["Peter", "Bob", "Alice", "Cynthia"];
var allnames = names1.concat(names2);
print (allnames); // 输出David,Cynthia,Jennifer,Peter,Bob,Alice,Cynthia
allnames = names2.concat(names1);
print(allnames); // 输出Peter,Bob,Alice,Cynthia,David,Cynthia,Jennifer
var firsttwo = allnames.splice(0, 2);
print(firsttwo); // 输出Peter,Bob
var lasttwo = allnames.splice(allnames.length-2, 2);
print(lasttwo); // 输出Cynthia,Jennifer
concat将两个数组连接,splice从一个数组中指定位置提取指定个数元素
- 添加元素
var nums = [1,2,3];
nums.push(4);
print(nums) ; // 输出 1,2,3,4
nums.push(5,6);
print(nums); // 输出1,2,3,4,5,6
nums.push([7,8,9]);
print(nums[6]); // 输出7,8,9
nums.unshift(0);
print(nums); // 输出 0,1,2,3
nums.unshift(-2,-1);
print(nums); // 输出 -2,-1,0,1,2,3
nums.unshift([-4,-3,-2]);
print(nums[0]); // 输出-4,-3,-2
print(nums.join(":")); // 输出-4,-3,-2:-2:-1:0:1:2:3:4:5:6:7,8,9
push函数向数组尾部添加元素;unshift函数向数组头部添加元素,所有元素后移。注意可以同时添加多个元素,包括数组本身也可以作为元素添加进去
- 从两端删除元素
var nums = [1,2,3];
var last = nums.pop();
print(nums); // 输出 1,2
nums.push(last);
print(nums); // 输出 1,2,3
var first = nums.shift();
print(nums); // 输出 2,3
nums.unshift(first);
print(nums); // 输出 1,2,3
方法pop和push对应,用于删除数组尾部元素;方法shift和unshfit对应,用于删除数组首元素
- 从中间添加/删除元素
var nums = [1,2,3,6,7,8];
nums.splice(3, 0, [4,5]);
print(nums); // 输出 1,2,3,4,5,6,7,8
nums.splice(3,2);
print(nums); // 输出 1,2,3,6,7,8
vals = nums.splice(3,3,[4,5]);
print(nums); // 输出 1,2,3,4,5
print(vals); // 输出 6,7,8
splice将数组指定位置删除,并用新内容替代。只提供两个参数时只删除指定位置元素
- 元素逆序与排序
var nums = [1,2,3];
nums.reverse();
print(nums); // 输出 3,2,1
var letters = ["ab","ce","bc","def"];
letters.sort();
print(letters); // 输出ab,bc,ce,def
var nums2 = [1,100, 2, 5, 300];
print(nums2.sort()); // 输出 1,100,2,300,5
// 对数字排序时会出现错误,因为js内部用字符串表示数字
function compare(n1, n2) {
return n1-n2;
}
print(nums2.sort(compare)); // 输出 1,2,5,100,300
使用reverse函数可以对数组元素逆序,使用sort函数可以对字符数组排序,其实是对象toString()后的内容。要对非字符串排序,需要自定义compare函数
- 迭代函数
function square(n) {
print(n, n*n);
}
var nums = [1,2,3,4,5];
nums.forEach(square);
// 输出下面内容
1 1
2 4
3 9
4 16
5 25
function isEven(n) {
return n % 2 == 0;
}
var nums = [0,2,4,6];
print(nums.every(isEven)) ; // 输出 true
var nums = [0,1,2];
print(nums.every(isEven)) ; // 输出 false
print(nums.some(isEven)); // 输出true
function add(total, current) {
return total+current;
}
var nums = [1,2,3,4,5];
print(nums.reduce(add)); // 输出 15
var words = ["you", "are", "who"];
function concat (accumulated, current) {
return accumulated + “ ” + current;
}
print( words.reduce(concat)); // 输出 you are who
print(words.reduceRight(concat)); // 输出 who are you
var nums = [1,2,3];
print(nums.map(function (v) { return v*v; }); // 输出 1,4,9
var marks = [55,70,89,50,95,99,100];
print(nums.filter(function (v) { return v>=60;}); // 输出 70,89,95,99,100
二维和高维数组
1.创建二维数组,js中的二维数组其实是一维数组,数组的元素仍然是数组
var arr2d = [ ];
arr2d[0] = [1,2,3];
arr2d[1] = [4,5];
arr2d[2] = [6];
print (arr2d); // 输出1,2,3,4,5,6
print (arr2d[0][2]); // 输出3
print(arr2d[1].length); // 输出2
第2维的长度可以变化
var grades = [[89, 77],[76, 82, 81],[91, 94, 89, 99]];
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: 83.00
Student 2 average: 79.67
Student 3 average: 93.25
上面程序计算学生成绩平均分并输出
总结
Javascript的数组非常灵活,它包含了堆栈、队列,和列表的常见接口,既能从两端增删元素,也能从中间增删元素;和其它脚本语言一样,js数组自动管理内存;js高维数组其实是一维数组的变形,即数组的数组;数组中内容排序时是按照字符(toString返回值)来的,对于数字或其它对象要自己定义比较函数;注意灵活使用数组的迭代器函数(forEach,every,some,reduce,filter等)可以提高编程效率,精简代码。
网友评论