數組被描述為一個存儲元素的線性集合,元素可以通過索引來任意存取。
幾乎所有的編程語言都有類似的數據結構,但是Javascript中的數組卻略有不同。
Javascript中的數組是一種特殊的對象,所以在數組的操作效率上不如其他語言中的數組高。
也因為數組再JavaScript中被當做對象,所以它有很多屬性和方法可以再編程時使用。
下面就簡單介紹一下JavaScript中的數組的使用方法。
注:以下所有的JavaScript代碼均在 jsshell 中運行,一些方法可能在其他環境中(如瀏覽器和sublime text)中不能運行。
【jsshell的使用】
/* Js-shell的使用
下載:http://mzl.la/MKOuFY
根據系統和語言選擇不同版本進行下載,下載完直接打開js-shell終端進行使用
*/
/**************** 在Js-shell中常用的一些Js方法 ***************/
print(); //打印頁面/在終端直接打印
putstr(""); //顯示提示信息
var num = readline(); //接受用戶輸入的信息
【 JavaScript中數組的操作】
/**************** JavaScript數組操作 ***************/
// 創建數組:
var arr1 = [];
var arr2 = [1,2,3,4,5];
var arr3 = new Array( );
var arr4 = new Array(10);
var arr5 = new Array(1,2,3,4,5);
// Js數組中的元素不必是同一種類型:
var arr6 = [1,”西瓜”,null,true];
// 判斷一個對象是否是數組:
Array.isArray( arr ); //顯示true/false
// 讀寫數組
for(var i=0;i<num.length;i++){
print(num[i]);
}
// 由字符串生成數組split(分隔符)
var sentence = "This is a sentence...";
var words = sentence.split(" "); //使用空格分割字符串並存在word數組中
//數組的操作
// 淺復制:新數組的依然指向原來的數組,修改原數組則新數組的內容跟着改變
var nums = [1,2,3,4,5];
var arr = nums; //直接講nums賦值給arr
nums[0] = 100; //修改nums數組第一個元素的內容
print(arr.[0]); //arr數組的第一個元素的內容也發生了改變
//深復制:即對原數組的每一個元素分別進行復制
for(var i=0;i<nums.length;i++){
arr[i] = nums[i];
}
nums[0] = 999;
print(arr[0]); //此時arr數組的第一個元素不發生改變,仍為1
// 數組的存取操作
//查找元素indexOf() 若找不到則返回-1
var names = ["Bob","Lily","John","Eileen","Sivan"];
var name = readline(); //用戶輸入一個要查找的名字
var position = names.indexOf(name); //函數返回的是被查找元素在數組中的索引
if(position>=0){ //如果用戶查找的名字在數組中存在
print("Found " + name + " at position " + postion);
}else{
print(name + " not found in array...");
}
//lastIndexOf();
// 數組的字符串表示
//toString()方法
var days = ["Monday","Tuesday","Wednesday","Thursday"];
var days_string = days.toString();
print(days_stirng); //輸出 Monday,Tuesday,Wednesday,Thursday
//join()方法
var days_string1 = days.join();
print(days_join); //輸出 Monday,Tuesday,Wednesday,Thursday
print(days); //輸出 Monday,Tuesday,Wednesday,Thursday
//直接對一個數學使用print()方法時,系統會自動調用toString()方法
// 由已有數組創建新數組
var nums = [1,2,3,4];
var names = ['Jane','Sam','Mike','Bob'];
var arr = nums.concat(names);
print(arr); //輸出 1,2,3,4,Jane,Sam,Mike,Bob
//splice()截取數組創建新數組(對原數組會有影響)
var numbers = [1,2,3,4,5,6,68,7];
var arr = numbers.splice(3,4); //從索引為3(第三個)的元素開始截取4個元素
print(arr); //輸出4,5,6,68
//push()為數組末尾添加元素
var seasons = ["Summer","Autumn"];
var push = seasons.push("Winter"); //也同時添加多個元素
//unshift()為數組開頭添加元素
var unshift = seasons.unshift("Spring");
//pop()刪除數組末尾元素;
var pop = seasons.pop();
//shift()刪除數組開頭的元素
var shift = seasons.shift();
// 從數組中間位置添加和刪除元素
var nums = [1,2,3,4,6,7,8];
var addNums = [9,9,9];
nums.splice(2,0,addNums);
print(nums); //輸出1,2,9,9,9,3,4,5,6,7,8
//數組排序
//reverse()方法
var nums = [1,2,3,4];
var arr = nums.reverse();
print(arr); //輸出4,3,2,1
//sort()方法
var name = ["Bob","Alice","Cindy"];
var arr = name.sort();
print(arr); //輸出 Alice,Bob,Cindy
//sort()方法只針對字符串根據字典順序進行排序,
//如果是數字類型,則需要傳入一個比較函數作為參數
function compare(num1,num2){
return num1 - num2;
}
var nums = [1,32,45,12];
var arr = nums.sort(compare); //僅傳入函數名稱
print(arr); //輸出1,12,32,45
/**************** 迭代器方法 ***************/
//forEach() 對數組中的每一個元素都執行某個方法
function square(num){
print(num,num*num);
}
var num = [1,2,3,4];
num.forEach(square); //輸出1 1,2 4,3 9
//every()方法 接受一個返回值為bool類型的函數作為參數,
// 若對於數組中所有元素,該函數均返回true,則該方法返回true
function isEven(num){
return num % 2 == 0;
}
var nums = [2,4,6,8];
var even = nums.every(isEven);
if(even){
print("All numbers are even...");
}else{
print("Not all numbers are even...");
} //輸出"All numbers are even..."
//some()方法 數組中只要有一個元素能使該函數返回true,該方法返回true
function isEven(num){
return num % 2 == 0;
}
var nums = [2,3,4,5,6];
var even = nums.some(isEven);
print(even); //輸出true
// reduce()
// 對數組進行逐項累加
function add(runningTodal,currentValue){
return runningTodal + currentValue;
}
var nums = [1,2,3,4,5];
var sum = nums.reduce(add);
print(sum); //輸出15
// 將數組元素鏈接成一個長字符串
function concat(accumulatedString,item){
return accumulatedString + item;
}
var words = ["This","is","a","good","day"];
var string = words.reduce(concat);
print(string); //輸出"This is a good day"
var string2 = words.reduceRight(concat); //從右到左執行
print(string2); //輸出"day good a is This"
/*生成新數組的迭代器方法*/
// map() 類似forEach(),對數組中的每一個元素都執行操作,但是返回的是一個新的數組
function curve(num){
return num+5;
}
var nums = [1,2,3,4];
var arr = nums.map(curve);
print(arr); //輸出 6,7,8,9
function first(word){
return word[0];
}
var names = ["Alice","Bob","Cindy","Daniel"];
var arr = names.map(first); //結果為["A","B","C","D"]
print(arr。join()); //輸出"A,B,C,D"
print(arr.join("")); //輸出"ABCD"
// filter() 傳入返回值為bool類型的函數名作為參數,對數組中每個元素都執行函數,
// 但是返回結果為使函數返回值為true的元素
//e.g 判斷數組元素的奇偶性
function isEven(num){
return num %2 == 0; //偶數
}
function isOdd(num){
return num %2 != 0; //奇數
}
var num = [];
for(var i=0;i<10;i++){
num[i] = i+1;
}
var evens = num.filter(isEven);
print("Even numbers: ");
print(evens); //輸出2,4,6,8,10
var odds = num.filter(isOdd);
print("Odd numbers: "); //輸出1,3,5,7,9
print(odds);
//e.g 判斷成績是否合格
function passing(num){
return num>=60;
}
var grade = [];
for(var i=0;i<20;i++){
grade[i] = Math.floor(Math.random()*101);
}
var pass = grade.flter(passing);
print("All grades: ");
print(grade);
print("Passing Grades: ");
print(pass);
//e.g. 過濾字符串數組
function del(str){
if(str.indexOf("cie")>-1){
return true;
}else{
return false;
}
}
var words = ["receive","decide","percieve","deceit","convince"];
var misspelled = word.filter(del);
print(misspelled); //輸出"percieve"
/* 二維和多維數組
*JavaScript中支持一維數組,但是可以通過在數組元素中保存數組的方法來創建多維數組
*/
// 創建二維數組
var num = [];
var rows = 5;
for(var i=0;i<rows;i++){
num[i] = []; //使數組中每個元素都是一個數組
}
/* 上述方法存在的問題是:數組中的每個元素都是undefined,更好的方式是按照
* JavaScript:The good part(O'Reilly) 的例子,通過擴展js數組對象,
* 新增一個方法,該方法根據傳入的參數,設定了數組的行數、列數和初始值,如下:
*/
Array.martix = function(numrows,numcols,initial){
var arr = [];
for(var i=0;i<numrows;i++){
var colnums = []; //定義列元素為數組
for(var j=0;j<numcols;j++){
colnums[j] = initial; //為元素的列賦值
}
arr[i] = colnums; //使元素的每一行均為數組
}
return arr;
}
//測試上述方法
var nums = Array.martix(3,4,0);
print(nums[2][3]); //顯示為0
//對於小規模的數據,可以直接創建二維數組如下:
var nums = [[1,2,3],[4,5,6],[7,8,9]];
//處理二維數組(對於參差不齊的數組同樣處理)
var total = 0;
var aver = 0;
for(var row=0;row<nums.length;i++){
for(var col=0;col<nums[row].length;col++){
total += nums[row][col];
}
aver = total / nums[row].length;
print("total: "+total+"; "+"Averge: "+aver.toFixed(2));
total = 0;
aver = 0.0;
}
/* 對象數組 */
function point(x,y){
this.x = x;
this.y = y;
}
var p1 = new point(1,2);
var p2 = new point(3,4);
var p3 = new point(5,6);
var p4 = new point(7,8);
var points = [p1,p2,p3,p4];
print(points);
//輸出的是[object Object],[object Object],[object Object],[object Object]
print(p1.x); //輸出1
points.push(new point(9,0));
print(points[4].y); //輸出0
points.shift();
print(points[0].x); //輸出3
/* 數組對象 */
// 創建對象,保存氣溫,並求出氣溫的平均值
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<dataStore.length;i++){
total += this.dataStore[i];
}
return total/this.dataStore.length;
}
var thisweek = new weekTemps();
thisweek.add(34); //像數組中添加元素
thisweek.add(43);
thisweek.add(54);
thisweek.add(30);
thisweek.add(75);
thisweek.add(66);
thisweek.add(73);
thisweek.add(56);
print(thisweek.average); //輸出平均溫度值
/*JavaScript數組操作練習*/
// e.g.1 創建一個記錄學生成績的對象,提供一個添加成績的方法,以及一個顯示學生平均成績的方法
function Grades(){ //構造方法用於初始化成績信息
this.scores = [];
this.add = add;
this.aver = aver;
}
function add(score){ //添加成績的方法
this.scores.push(score);
}
function aver(){ //顯示平均成績的方法
var total = 0;
for(var i=0;i<scores.length;i++){
total += this.scores[i];
}
return total / this.scores.length;
}
var grade = new Grades(); //創建成績對象
grade.add(87); //逐個添加成績數組中的元素
grade.add(98);
grade.add(79);
grade.add(86);
grade.add(58);
grade.add(73);
print(grade.aver); //計算平均成績
// e.g.2 將一組單詞存儲在一個數組中,並按正序和逆序分別顯示這些單詞
var words = ["Bob","Alice","Daneil","Cindy"];
var arr1 = words.sort();
print(arr1); //輸出 Alice,Bob,Cindy,Daneil
var arr2 = arr1.reverse();
print(arr2); //輸出 Daneil,Cindy,Bob,Alice
// e.g.3 修改前面的weekTemps對象,使它可以使用二維數組來存儲每月的有用數據,
// 增加一些方法用以顯示平均數、具體某一周平均數和所有周的平均數
// e.g.4 創建這樣一個對象,它將字母存儲在一個數組中,並且用一個方法可以將字母
// 連在一起,顯示成一個單詞
function obj_letter(){
this.letters = [];
this.add = add;
this.linking = link;
// 此處一定要將add方法也賦值,否則對象無法使用此方法,不同與Java中方法在類中,
// 創建類對象可以直接使用類方法,在這里所有的方法都要身名稱為對象的方法
}
function add(item){
this.letters.push(item);
}
function linking(arr){
// return arr.join();
// 直接調用join()或toString()方法產生的數組字符串之間會有逗號。
return arr.join("");
}
var obj = new obj_letter();
obj.add('h');
obj.add('e');
obj.add('l');
obj.add('l');
obj.add('o');
var word = obj.linking(obj.letters);
print(word); //輸出 hello
/******************** The End *************************/
