1.[数据结构与算法javascript]——数组篇(持续更新中)

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



6.对象数组

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

推荐阅读更多精彩内容