JavaScript数组

1、由字符串生成数组
调用字符串的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+":"+word[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

2、查找数组
indexof()函数是最常存取函数之一,用来查找传进来的参数目标是否存在。

var names = ["David", "Cynthia", "Raymond", "Clayton", "Jennifer"];
var name=readline();
var position=names.indexOf(name);
if(position>=0){
     print("Found"++name+"at position"+position)
}

3、数组的字符串表示
有两个方法可以将数组转化为字符串,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

4、由已有的数组创建新的数组
concat()和splice()方法允许通过已有的数组创建新的数组,concat方法可以合并多个数组创建一个新的数组,splice()方法截取一个数组的子集没创建一个新的数组
array=Array1.concat(array2); Array1的元素在前面
5、添加元素
push()和unshift() push方法将一个元素添加到数组的末尾,unshif()将元素添加到数组的开头
使用pop() 方法可以删除数组末尾的元素:

var nums = [1,2,3,4,5,9];
nums.pop();
print(nums); // 1,2,3,4,5

如果没有可变函数,从数组中删除第一个元素需要将后续元素各自向前移动一个位置,和
在数组开头添加一个元素一样低效:

var nums = [9,1,2,3,4,5];
print(nums);
for (var i = 0; i < nums.length; ++i) {
nums[i] = nums[i+1];
}
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

这回数组末尾那个多余的逗号消失了。pop() 和shift() 方法都将删掉的元素作为方法的
返回值返回,因此可以使用一个变量来保存删除的元素:

var nums = [6,1,2,3,4,5];
var first = nums.shift(); // first gets the value 9
nums.push(first);
print(nums); // 1,2,3,4,5,6

6、从数组中间位置添加和删除元素
使用splice() 方法为数组添加元素,需提供如下参数:
起始:
• 索引(也就是你希望开始添加元素的地方);
• 需要删除的元素个数(添加元素时该参数设为 0);
• 想要添加进数组的元素。
看一个简单的例子。下面的程序在数组中间插入元素:

var nums = [1,2,3,7,8,9];
var newElements = [4,5,6];
nums.splice(3,0,newElements);
print(nums); // 1,2,3,4,5,6,7,8,9

要插入数组的元素不必组织成一个数组,它可以是任意的元素序列,比如:

var nums = [1,2,3,7,8,9];
nums.splice(3,0,4,5,6);
print(nums);

在上面的例子中,参数4、5、6 就是我们想插入数组nums 的元素序列。
下面是使用splice() 方法从数组中删除元素的例子:

var nums = [1,2,3,100,200,300,400,4,5];
nums.splice(3,4);
print(nums); // 1,2,3,4,5

7、不生成新数组的迭代器方法
第一个方法是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

另一个迭代器方法是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
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

reduce() 方法接受一个函数,返回一个值。该方法会从一个累加值开始,不断对累加值和
数组中的后续元素调用该函数,直到数组中的最后一个元素,最后返回得到的累加值。下
面这个例子展示了如何使用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() 方法和add() 函数一起,从左到右,依次对数组中的元素求和,其执行过程如下
所示:
add(1,2) -> 3
add(3,3) -> 6
add(6,4) -> 10
add(10,5) -> 15
add(15,6) -> 21
add(21,7) -> 28
add(28,8) -> 36
add(36,9) -> 45
add(45,10) -> 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"
JavaScript 还提供了reduceRight() 方法,和reduce() 方法不同,它是从右到左执行。下面
的程序使用reduceRight() 方法将数组中的元素进行翻转:
function concat(accumulatedString, item) {
     return accumulatedString + item;
}
var words = ["the ", "quick ","brown ", "fox "];
var sentence = words.reduceRight(concat);
print(sentence); // 显示 "fox brown quick the"

8、生成新数组的迭代器方法

有两个迭代器方法可以产生新数组:map() 和filter()。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
下面是对一个字符串数组使用map() 方法的例子:
function first(word) {
     return word[0];
}
var words = ["for","your","information"];
var acronym = words.map(first);
print(acronym.join("")); // 显示"fyi"

在上面这个例子中,数组acronym 保存了数组words 中每个元素的第一个字母。然而,如果想将数组显示为真正的缩略形式,必须想办法除掉连接每个数组元素的逗号,如果直接
调用toString() 方法,就会显示出这个逗号。使用join() 方法,为其传入一个空字符串作为参数,则可以帮助我们解决这个问题。
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
下面是另一个使用filter() 方法的有趣案例:
function passing(num) {
     return num >= 60;
}
var grades = [];
for (var i = 0; i < 20; ++i) {
     grades[i] = Math.floor(Math.random() * 101);
}
var passGrades = grades.filter(passing);
print("All grades: );
print(grades);
print("Passing grades: ");
print(passGrades);

程序显示:
All grades:
39,43,89,19,46,54,48,5,13,31,27,95,62,64,35,75,79,88,73,74
Passing grades:
89,95,62,64,75,79,88,73,74
当然,还可以使用filter() 方法过滤字符串数组,下面这个例子过滤掉了那些不包含“cie”的单词:
function afterc(str) {
if (str.indexOf("cie") > -1) {
     return true;
}
return false;
}
var words = ["recieve","deceive","percieve","deceit","concieve"];
var misspelled = words.filter(afterc);
print(misspelled); // 显示recieve,percieve,concieve

10、创建二维数组
通过扩展JavaScript 数组对象,为其增加了一个新方法,该方法根据传入的参数,设定了数组的行数、列数和初始值。下面是这个方法的定义:

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"
还可以仅用一行代码就创建并且使用一组初始值来初始化一个二维数组:
var grades = [[89, 77, 78],[76, 82, 81],[91, 94, 89]];
print(grades[2][2]); // 显示 89
对于小规模的数据,这是创建二维数组最简单的方式。

11、处理二维数组

处理二维数组中的元素,有两种最基本的方式:按列访问和按行访问。我们将使用前面创建的数组grades 来展示这两种方式的工作原理。
对于两种方式,我们均使用一组嵌入式的for 循环。对于按列访问,外层循环对应行,内层循环对应列。以数组grades 为例,每一行对应一个学生的成绩记录。我们可以将该学生
的所有成绩相加,然后除以科目数得到该学生的平均成绩。下面的代码展示了这一过程:

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;
}

内层循环由下面这个表达式控制:
col < grades[row].length
这个表达式之所以可行,是因为每一行都是一个数组,我们可以使用数组的length 属性判
断每行包含多少列。
以下为程序的输出:

Student 1 average: 81.33
Student 2 average: 79.67
Student 3 average: 91.33

对于按行访问,只需要稍微调整for 循环的顺序,使外层循环对应列,内层循环对应行即
可。下面的程序计算了一个学生各科的平均成绩:

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

推荐阅读更多精彩内容

  • 数组对于一个编程语言而言可谓举足轻重,当然 JavaScript 也对其相当重视,下面我就将自己接触到的数组有关的...
    ghwaphon阅读 735评论 0 2
  • 整理一下常用的数组方法(含ES6) Array.from(arrayLike[, mapFn[, thisArg]...
    慢飞鸟阅读 250评论 0 0
  • concat 注意,a数组并没有改变,只是返回了一个新数组。 copyWithin 它接受三个参数。target ...
    Funwt阅读 663评论 0 10
  • (写于2017年8月) 诱发这次关于婚姻的思考的导火索是朋友结婚事件。 最近朋友和她的相亲对象因为结婚的事情闹得沸...
    西瓜皮ing阅读 281评论 0 0
  • 在一个阳光暖暖的午后,我倚靠在床头:曾经的过往一幕幕快速闪现,如同电影再版回放。当时浑身一个冷颤,我不知道这究竟是...
    晴织雨耕阅读 451评论 1 2