JavaScript操做數組

數組被描述爲一個存儲元素的線性集合,元素能夠經過索引來任意存取。javascript

幾乎全部的編程語言都有相似的數據結構,可是Javascript中的數組卻略有不一樣。java

Javascript中的數組是一種特殊的對象,因此在數組的操做效率上不如其餘語言中的數組高。shell

也由於數組再JavaScript中被當作對象,因此它有不少屬性和方法能夠再編程時使用。編程

下面就簡單介紹一下JavaScript中的數組的使用方法。數組

注:如下全部的JavaScript代碼均在 jsshell 中運行,一些方法可能在其餘環境中(如瀏覽器和sublime text)中不能運行。瀏覽器

【jsshell的使用】數據結構

/* Js-shell的使用
下載:http://mzl.la/MKOuFY
根據系統和語言選擇不一樣版本進行下載,下載完直接打開js-shell終端進行使用
*/

/**************** 在Js-shell中經常使用的一些Js方法 ***************/
print();  	//打印頁面/在終端直接打印
putstr(""); //顯示提示信息
var num = readline();  //接受用戶輸入的信息

【 JavaScript中數組的操做】dom

/**************** 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 *************************/
相關文章
相關標籤/搜索