1.創建數組
var numbers = []; var numbers = new Array(); //在調用 Array 的構造函數時,可以只傳入一個參數,用來指定數組的長度 var numbers = new Array(10) console.log(numbers.length)// 顯示 10 可以調用 Array.isArray() 來判斷一個對象是否是數組2.由字符串生成數組
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 + ": " + 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)淺復制,新數組依然指向原來的數組(當把一個數組賦給另外一個數組時,只是為被賦值的數組增加了一個新的引用。當你通過原引用修改了數組的值,另外一個引用也會感知到這個變化)
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]); // 顯示 13.存取函數
JavaScript 提供了一組用來訪問數組元素的函數,叫做存取函數,這些函數返回目標數組 的某種變體
查找元素
(1)indexOf(),用來查找傳進來的參數在目標數組中是否存在,如果目標數組包含該參數,就返回該元素在數組中的索引;如果不包含,就返回 -1。如果數組中包含多個相同的元素,indexOf() 函數總是返回第一個與參數相同的元素的索引。
(2)lastIndexOf(),該函數返回相同元素中最后一個元素的索引,如果沒找到相同元素,則返回 -1
數組的字符串表示
將數組轉化為字符串:join() 和 toString(),這兩個方法都返回一個包含數組所有元素的字符串,各元素之間用逗號分隔開
由已有數組創建新數組
concat() 和 splice() 方法允許通過已有數組創建新數組。concat 方法可以合并多個數組
創建一個新數組,splice() 方法截取一個數組的子集創建一個新數組。
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.為數組添加元素
push() 方法會將一個元素添加到數組末尾
unshift() 方法可以將元素添加在數組的開頭
使用 pop() 方法可以刪除數組末尾的元素
shift() 方法可以刪除數組的第一個元素
使用 splice() 方法為數組添加元素,需提供如下參數:
? 起始索引(也就是你希望開始添加元素的地方);
? 需要刪除的元素個數(添加元素時該參數設為 0);
? 想要添加進數組的元素。
reverse(),該方法將數組中元素的順序進行翻轉
sort() 方法是按照字典順序對元素進行排序的,因此它假定元素都是字符串類型
var names = ["David","Mike","Cynthia","Clayton","Bryan","Raymond"]; names.sort();// Bryan,Clayton,Cynthia,David,Mike,Raymond names.sort().reverse()//Raymond,Mike,David,Cynthia,Bryan
對于數字類型,該函數可以是一個簡單的相減操作,從一個數字中減去另外一個數字。如
果結果為負,那么被減數小于減數;如果結果為 0,那么被減數與減數相等;如果結果為
正,那么被減數大于減數。
將這些搞清楚之后,傳入一個大小比較函數,再來看看前面的例子:
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() 函數使用了 compare() 函數對數組按照數字大小進行排序,而不是按照字典順序。
不生成新數組的迭代器方法
是 forEach(),該方法接受一個函數作為參數,對數組中的每個元素使用該函數。
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(),該方法接受一個返回值為布爾類型的函數,對數組中的每個元素使用該函數。如果對于所有的元素,該函數均返回 true,則該方法返回 true。
請輸入代碼
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() 方法也接受一個返回值為布爾類型的函數,只要有一個元素使得該函數返回 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() 方法接受一個函數,返回一個值。該方法會從一個累加值開始,不斷對累加值和數組中的后續元素調用該函數,直到數組中的最后一個元素,最后返回得到的累加值。
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
生成新數組的迭代器方法
map() 和 filter()
map() 返回一個新的數組,該數組的元素是對原有元素應用某個函數得到的結果
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
對一個字符串數組使用 map() 方法的例子:
function first(word) { return word[0]; } var words = ["for","your","information"]; var acronym = words.map(first); print(acronym.join("")); // 顯示 "fyi"
filter(),傳入一個返回值為布爾類型的函數,當對數組中的所有元素應用該函數,結果均為 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); console.log("Even numbers: "); console.log(evens); var odds = nums.filter(isOdd); console.log("Odd numbers: "); console.log(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() 方法過濾字符串數組,下面這個例子過濾掉了那些不包含
“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二維和多維數組 1.創建二維數組
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.處理二維數組的元素
處理二維數組中的元素,有兩種最基本的方式:按列訪問和按行訪問
//得到該學生的平均成績 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
//一個學生各科的平均成績 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.參差不齊的數組
//為了給個示例,假設數組 grades 中,每個學生成績記錄的個數是不一樣的,不用修改代碼,依然可以正確計算出正確的平均分: 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; } //注意第一名同學只有兩門課的成績,而第二名同學有三門課的成績,第三名同學有四門課的成績。因為程序在內層的 for 循環中計算了每個數組的長度,即使數組中每一行的長度不一,程序依然不會出什么問題。該段程序的輸出為: Student 1 average: 83.00 Student 2 average: 79.67 Student 3 average: 93.25對象數組
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)對象中的數組
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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/93757.html
摘要:上一篇數據結構與算法樹寫在前面這是學習數據結構與算法的最后一篇博客,也是在面試中常常會被問到的一部分內容排序和搜索。 上一篇:JS數據結構與算法_樹 寫在前面 這是《學習JavaScript數據結構與算法》的最后一篇博客,也是在面試中常常會被問到的一部分內容:排序和搜索。在這篇博客之前,我每每看到排序頭就是大的,心里想著類似冒泡排序,兩層遍歷啪啪啪就完事了,然后再也無心去深入研究排序相...
摘要:的擴展知識對于哈希表來說,最重要的莫過于生成哈希串的哈希算法和處理沖突的策略了。由于鏈表的查找需要遍歷,如果我們將鏈表換成樹或者哈希表結構,那么就能大幅提高沖突元素的查找效率。 最近在整理數據結構和算法相關的知識,小茄專門在github上開了個repo https://github.com/qieguo2016...,后續內容也會更新到這里,歡迎圍觀加星星! js對象 js中的對象是基...
摘要:今天同學去面試,做了兩道面試題全部做錯了,發過來給道典型的面試題前端掘金在界中,開發人員的需求量一直居高不下。 排序算法 -- JavaScript 標準參考教程(alpha) - 前端 - 掘金來自《JavaScript 標準參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡介 算法實現 選擇排序 簡介 算法實現 ... 圖例詳解那道 setTimeout 與循環閉包的經典面...
摘要:算法第一章學習筆記實現更多內容目標總結本書主要內容,相應算法使用來模仿實現在計算機科學領域,我們用算法這個詞來描述一種有限確定有效的并適合用計算機程序來實現的解決問題的方法。 《算法》第一章學習筆記js實現 更多內容 目標:總結本書主要內容,相應算法使用js來模仿實現 在計算機科學領域,我們用算法這個詞來描述一種有限、確定、有效的并適合用計算機程序來實現的解決問題的方法。我們關注的大多...
摘要:算法第一章學習筆記實現更多內容目標總結本書主要內容,相應算法使用來模仿實現在計算機科學領域,我們用算法這個詞來描述一種有限確定有效的并適合用計算機程序來實現的解決問題的方法。 《算法》第一章學習筆記js實現 更多內容 目標:總結本書主要內容,相應算法使用js來模仿實現 在計算機科學領域,我們用算法這個詞來描述一種有限、確定、有效的并適合用計算機程序來實現的解決問題的方法。我們關注的大多...
摘要:算法第一章學習筆記實現更多內容目標總結本書主要內容,相應算法使用來模仿實現在計算機科學領域,我們用算法這個詞來描述一種有限確定有效的并適合用計算機程序來實現的解決問題的方法。 《算法》第一章學習筆記js實現 更多內容 目標:總結本書主要內容,相應算法使用js來模仿實現 在計算機科學領域,我們用算法這個詞來描述一種有限、確定、有效的并適合用計算機程序來實現的解決問題的方法。我們關注的大多...
閱讀 1303·2021-11-11 10:57
閱讀 3717·2021-09-07 10:10
閱讀 3442·2021-08-03 14:03
閱讀 3067·2019-08-30 13:45
閱讀 681·2019-08-29 11:19
閱讀 1039·2019-08-28 18:07
閱讀 3100·2019-08-26 13:55
閱讀 809·2019-08-26 12:17