1.創(chuàng)建數(shù)組
var numbers = []; var numbers = new Array(); //在調(diào)用 Array 的構(gòu)造函數(shù)時(shí),可以只傳入一個(gè)參數(shù),用來(lái)指定數(shù)組的長(zhǎng)度 var numbers = new Array(10) console.log(numbers.length)// 顯示 10 可以調(diào)用 Array.isArray() 來(lái)判斷一個(gè)對(duì)象是否是數(shù)組2.由字符串生成數(shù)組
1字符串對(duì)象的 split() 方法也可以生成數(shù)組
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)淺復(fù)制,新數(shù)組依然指向原來(lái)的數(shù)組(當(dāng)把一個(gè)數(shù)組賦給另外一個(gè)數(shù)組時(shí),只是為被賦值的數(shù)組增加了一個(gè)新的引用。當(dāng)你通過(guò)原引用修改了數(shù)組的值,另外一個(gè)引用也會(huì)感知到這個(gè)變化)
var nums = []; for (var i = 0; i < 100; i++) { nums[i] = i+1; } var samenums = nums; nums[0] = 400; print(samenums[0]); // 顯示 400
(2)深復(fù)制,將原數(shù)組中的每一個(gè)元素都復(fù)制一份到新數(shù)組中。
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]); // 顯示 13.存取函數(shù)
JavaScript 提供了一組用來(lái)訪問(wèn)數(shù)組元素的函數(shù),叫做存取函數(shù),這些函數(shù)返回目標(biāo)數(shù)組 的某種變體
查找元素
(1)indexOf(),用來(lái)查找傳進(jìn)來(lái)的參數(shù)在目標(biāo)數(shù)組中是否存在,如果目標(biāo)數(shù)組包含該參數(shù),就返回該元素在數(shù)組中的索引;如果不包含,就返回 -1。如果數(shù)組中包含多個(gè)相同的元素,indexOf() 函數(shù)總是返回第一個(gè)與參數(shù)相同的元素的索引。
(2)lastIndexOf(),該函數(shù)返回相同元素中最后一個(gè)元素的索引,如果沒(méi)找到相同元素,則返回 -1
數(shù)組的字符串表示
將數(shù)組轉(zhuǎn)化為字符串:join() 和 toString(),這兩個(gè)方法都返回一個(gè)包含數(shù)組所有元素的字符串,各元素之間用逗號(hào)分隔開(kāi)
由已有數(shù)組創(chuàng)建新數(shù)組
concat() 和 splice() 方法允許通過(guò)已有數(shù)組創(chuàng)建新數(shù)組。concat 方法可以合并多個(gè)數(shù)組
創(chuàng)建一個(gè)新數(shù)組,splice() 方法截取一個(gè)數(shù)組的子集創(chuàng)建一個(gè)新數(shù)組。
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,Jennifer4.為數(shù)組添加元素
push() 方法會(huì)將一個(gè)元素添加到數(shù)組末尾
unshift() 方法可以將元素添加在數(shù)組的開(kāi)頭
使用 pop() 方法可以刪除數(shù)組末尾的元素
shift() 方法可以刪除數(shù)組的第一個(gè)元素
使用 splice() 方法為數(shù)組添加元素,需提供如下參數(shù):
? 起始索引(也就是你希望開(kāi)始添加元素的地方);
? 需要?jiǎng)h除的元素個(gè)數(shù)(添加元素時(shí)該參數(shù)設(shè)為 0);
? 想要添加進(jìn)數(shù)組的元素。
reverse(),該方法將數(shù)組中元素的順序進(jìn)行翻轉(zhuǎn)
sort() 方法是按照字典順序?qū)υ剡M(jìn)行排序的,因此它假定元素都是字符串類型
var names = ["David","Mike","Cynthia","Clayton","Bryan","Raymond"]; names.sort();// Bryan,Clayton,Cynthia,David,Mike,Raymond names.sort().reverse()//Raymond,Mike,David,Cynthia,Bryan
對(duì)于數(shù)字類型,該函數(shù)可以是一個(gè)簡(jiǎn)單的相減操作,從一個(gè)數(shù)字中減去另外一個(gè)數(shù)字。如
果結(jié)果為負(fù),那么被減數(shù)小于減數(shù);如果結(jié)果為 0,那么被減數(shù)與減數(shù)相等;如果結(jié)果為
正,那么被減數(shù)大于減數(shù)。
將這些搞清楚之后,傳入一個(gè)大小比較函數(shù),再來(lái)看看前面的例子:
function compare(num1, num2) {
return num1 - num2;
}
var nums = [3,1,2,100,4,200];
nums.sort(compare);
console.log(nums); // 1,2,3,4,100,200
sort() 函數(shù)使用了 compare() 函數(shù)對(duì)數(shù)組按照數(shù)字大小進(jìn)行排序,而不是按照字典順序。
不生成新數(shù)組的迭代器方法
是 forEach(),該方法接受一個(gè)函數(shù)作為參數(shù),對(duì)數(shù)組中的每個(gè)元素使用該函數(shù)。
function square(num) { console.log(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(),該方法接受一個(gè)返回值為布爾類型的函數(shù),對(duì)數(shù)組中的每個(gè)元素使用該函數(shù)。如果對(duì)于所有的元素,該函數(shù)均返回 true,則該方法返回 true。
請(qǐng)輸入代碼
function isEven(num) { return num % 2 == 0; } var nums = [2,4,6,8,10]; var even = nums.every(isEven); if (even) { console.log("all numbers are even"); } else { console.log("not all numbers are even"); } //輸出為: all numbers are even
some() 方法也接受一個(gè)返回值為布爾類型的函數(shù),只要有一個(gè)元素使得該函數(shù)返回 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() 方法接受一個(gè)函數(shù),返回一個(gè)值。該方法會(huì)從一個(gè)累加值開(kāi)始,不斷對(duì)累加值和數(shù)組中的后續(xù)元素調(diào)用該函數(shù),直到數(shù)組中的最后一個(gè)元素,最后返回得到的累加值。
function add(runningTotal, currentValue) { return runningTotal + currentValue; } var nums = [1,2,3,4,5,6,7,8,9,10]; var sum = nums.reduce(add); console.log(sum); // 顯示 55
生成新數(shù)組的迭代器方法
map() 和 filter()
map() 返回一個(gè)新的數(shù)組,該數(shù)組的元素是對(duì)原有元素應(yīng)用某個(gè)函數(shù)得到的結(jié)果
function curve(grade) { return grade += 5; } var grades = [77, 65, 81, 92, 83]; var newgrades = grades.map(curve); consoe.log(newgrades); // 82, 70, 86, 97, 88
對(duì)一個(gè)字符串?dāng)?shù)組使用 map() 方法的例子:
function first(word) { return word[0]; } var words = ["for","your","information"]; var acronym = words.map(first); print(acronym.join("")); // 顯示 "fyi"
filter(),傳入一個(gè)返回值為布爾類型的函數(shù),當(dāng)對(duì)數(shù)組中的所有元素應(yīng)用該函數(shù),結(jié)果均為 true 時(shí),該方法并不返回 true,而是返回一個(gè)新數(shù)組,該數(shù)組包含應(yīng)用該函數(shù)后結(jié)果為 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); console.log("Even numbers: "); console.log(evens); var odds = nums.filter(isOdd); console.log("Odd numbers: "); console.log(odds); //該程序的執(zhí)行結(jié)果如下: 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() 方法過(guò)濾字符串?dāng)?shù)組,下面這個(gè)例子過(guò)濾掉了那些不包含
“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); console.log(misspelled); // 顯示 recieve,percieve,concieve二維和多維數(shù)組 1.創(chuàng)建二維數(shù)組
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; }2.處理二維數(shù)組的元素
處理二維數(shù)組中的元素,有兩種最基本的方式:按列訪問(wèn)和按行訪問(wèn)
//得到該學(xué)生的平均成績(jī) 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; console.log("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
//一個(gè)學(xué)生各科的平均成績(jī) 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.673.參差不齊的數(shù)組
//為了給個(gè)示例,假設(shè)數(shù)組 grades 中,每個(gè)學(xué)生成績(jī)記錄的個(gè)數(shù)是不一樣的,不用修改代碼,依然可以正確計(jì)算出正確的平均分: 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; } //注意第一名同學(xué)只有兩門課的成績(jī),而第二名同學(xué)有三門課的成績(jī),第三名同學(xué)有四門課的成績(jī)。因?yàn)槌绦蛟趦?nèi)層的 for 循環(huán)中計(jì)算了每個(gè)數(shù)組的長(zhǎng)度,即使數(shù)組中每一行的長(zhǎng)度不一,程序依然不會(huì)出什么問(wèn)題。該段程序的輸出為: Student 1 average: 83.00 Student 2 average: 79.67 Student 3 average: 93.25對(duì)象數(shù)組
function Point(x,y) { this.x = x; this.y = y; } function displayPts(arr) { for (var i = 0; i < arr.length; ++i) { print(arr[i].x + ", " + arr[i].y); } } var p1 = new Point(1,2); var p2 = new Point(3,5); var p3 = new Point(2,8); var p4 = new Point(4,4); var points = [p1,p2,p3,p4]; for (var i = 0; i < points.length; ++i) { print("Point " + parseInt(i+1) + ": " + points[i].x + ", " + points[i].y); } var p5 = new Point(12,-3); points.push(p5); print("After push: "); displayPts(points); points.shift(); print("After shift: "); displayPts(points)對(duì)象中的數(shù)組
function weekTemps() { this.dataStore = []; this.add = add; this.average = average; } function add(temp) { this.dataStore.push(temp); } function average() { var total = 0; for (var i = 0; i < this.dataStore.length; ++i) { total += this.dataStore[i]; } return total / this.dataStore.length; } var thisWeek = new weekTemps(); thisWeek.add(52); thisWeek.add(55); thisWeek.add(61); thisWeek.add(65); thisWeek.add(55); thisWeek.add(50); thisWeek.add(52); thisWeek.add(49); print(thisWeek.average()); // 顯示 54.875
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/93757.html
摘要:上一篇數(shù)據(jù)結(jié)構(gòu)與算法樹(shù)寫在前面這是學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的最后一篇博客,也是在面試中常常會(huì)被問(wèn)到的一部分內(nèi)容排序和搜索。 上一篇:JS數(shù)據(jù)結(jié)構(gòu)與算法_樹(shù) 寫在前面 這是《學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法》的最后一篇博客,也是在面試中常常會(huì)被問(wèn)到的一部分內(nèi)容:排序和搜索。在這篇博客之前,我每每看到排序頭就是大的,心里想著類似冒泡排序,兩層遍歷啪啪啪就完事了,然后再也無(wú)心去深入研究排序相...
摘要:的擴(kuò)展知識(shí)對(duì)于哈希表來(lái)說(shuō),最重要的莫過(guò)于生成哈希串的哈希算法和處理沖突的策略了。由于鏈表的查找需要遍歷,如果我們將鏈表?yè)Q成樹(shù)或者哈希表結(jié)構(gòu),那么就能大幅提高沖突元素的查找效率。 最近在整理數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的知識(shí),小茄專門在github上開(kāi)了個(gè)repo https://github.com/qieguo2016...,后續(xù)內(nèi)容也會(huì)更新到這里,歡迎圍觀加星星! js對(duì)象 js中的對(duì)象是基...
摘要:今天同學(xué)去面試,做了兩道面試題全部做錯(cuò)了,發(fā)過(guò)來(lái)給道典型的面試題前端掘金在界中,開(kāi)發(fā)人員的需求量一直居高不下。 排序算法 -- JavaScript 標(biāo)準(zhǔn)參考教程(alpha) - 前端 - 掘金來(lái)自《JavaScript 標(biāo)準(zhǔn)參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡(jiǎn)介 算法實(shí)現(xiàn) 選擇排序 簡(jiǎn)介 算法實(shí)現(xiàn) ... 圖例詳解那道 setTimeout 與循環(huán)閉包的經(jīng)典面...
摘要:算法第一章學(xué)習(xí)筆記實(shí)現(xiàn)更多內(nèi)容目標(biāo)總結(jié)本書主要內(nèi)容,相應(yīng)算法使用來(lái)模仿實(shí)現(xiàn)在計(jì)算機(jī)科學(xué)領(lǐng)域,我們用算法這個(gè)詞來(lái)描述一種有限確定有效的并適合用計(jì)算機(jī)程序來(lái)實(shí)現(xiàn)的解決問(wèn)題的方法。 《算法》第一章學(xué)習(xí)筆記js實(shí)現(xiàn) 更多內(nèi)容 目標(biāo):總結(jié)本書主要內(nèi)容,相應(yīng)算法使用js來(lái)模仿實(shí)現(xiàn) 在計(jì)算機(jī)科學(xué)領(lǐng)域,我們用算法這個(gè)詞來(lái)描述一種有限、確定、有效的并適合用計(jì)算機(jī)程序來(lái)實(shí)現(xiàn)的解決問(wèn)題的方法。我們關(guān)注的大多...
摘要:算法第一章學(xué)習(xí)筆記實(shí)現(xiàn)更多內(nèi)容目標(biāo)總結(jié)本書主要內(nèi)容,相應(yīng)算法使用來(lái)模仿實(shí)現(xiàn)在計(jì)算機(jī)科學(xué)領(lǐng)域,我們用算法這個(gè)詞來(lái)描述一種有限確定有效的并適合用計(jì)算機(jī)程序來(lái)實(shí)現(xiàn)的解決問(wèn)題的方法。 《算法》第一章學(xué)習(xí)筆記js實(shí)現(xiàn) 更多內(nèi)容 目標(biāo):總結(jié)本書主要內(nèi)容,相應(yīng)算法使用js來(lái)模仿實(shí)現(xiàn) 在計(jì)算機(jī)科學(xué)領(lǐng)域,我們用算法這個(gè)詞來(lái)描述一種有限、確定、有效的并適合用計(jì)算機(jī)程序來(lái)實(shí)現(xiàn)的解決問(wèn)題的方法。我們關(guān)注的大多...
摘要:算法第一章學(xué)習(xí)筆記實(shí)現(xiàn)更多內(nèi)容目標(biāo)總結(jié)本書主要內(nèi)容,相應(yīng)算法使用來(lái)模仿實(shí)現(xiàn)在計(jì)算機(jī)科學(xué)領(lǐng)域,我們用算法這個(gè)詞來(lái)描述一種有限確定有效的并適合用計(jì)算機(jī)程序來(lái)實(shí)現(xiàn)的解決問(wèn)題的方法。 《算法》第一章學(xué)習(xí)筆記js實(shí)現(xiàn) 更多內(nèi)容 目標(biāo):總結(jié)本書主要內(nèi)容,相應(yīng)算法使用js來(lái)模仿實(shí)現(xiàn) 在計(jì)算機(jī)科學(xué)領(lǐng)域,我們用算法這個(gè)詞來(lái)描述一種有限、確定、有效的并適合用計(jì)算機(jī)程序來(lái)實(shí)現(xiàn)的解決問(wèn)題的方法。我們關(guān)注的大多...
閱讀 1317·2021-11-11 10:57
閱讀 3735·2021-09-07 10:10
閱讀 3452·2021-08-03 14:03
閱讀 3080·2019-08-30 13:45
閱讀 694·2019-08-29 11:19
閱讀 1050·2019-08-28 18:07
閱讀 3110·2019-08-26 13:55
閱讀 818·2019-08-26 12:17