Javascript 数组

Javascript 中的数组array是一种特殊的对象,数组下标可以视为对象的属性名称,注意js内部会将数组下标整数转换为字符以统一表示对象。

数组对应类名称为Array,它包含了许多属性和函数方便用户使用。其中包括查询、排序等常见操作。


创建数组

  1. 使用方括号 [ ] 操作符
var numbers1 = [];
print(numbers1.length);  // 输出长度为0
var numbers2 = [1,2,3,4];
print(numbers2.length); // 输出长度为4
  1. 使用构造函数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

注意构造函数参数多个时表示数组元素,一个参数时表示数组长度。

  1. 和许多脚本语言一样,数组元素不必是同种类型
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专家建议尽量使用 [ ] 来创建数组,因为它更加高效。

  1. 从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]);
    }

读取和写入数组元素

  1. 可以使用 [ ] 运算符,注意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
  1. 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
  1. 查找数组元素
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

  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方法

  1. 从已有数组产生新数组
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从一个数组中指定位置提取指定个数元素

  1. 添加元素
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函数向数组头部添加元素,所有元素后移。注意可以同时添加多个元素,包括数组本身也可以作为元素添加进去

  1. 从两端删除元素
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对应,用于删除数组首元素

  1. 从中间添加/删除元素
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将数组指定位置删除,并用新内容替代。只提供两个参数时只删除指定位置元素

  1. 元素逆序与排序
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函数

  1. 迭代函数
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等)可以提高编程效率,精简代码。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容