• JavaScript操作数组


    数组被描述为一个存储元素的线性集合,元素可以通过索引来任意存取。

    几乎所有的编程语言都有类似的数据结构,但是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 *************************/
    

     

  • 相关阅读:
    Why does the memory usage increase when I redeploy a web application?
    lsof
    Advising controllers with the @ControllerAdvice annotation
    springMVC(一): 整体请求过程概述
    正则表达式30分钟入门教程
    Python基本语法_强制数据类型转换
    Python 正则表达式入门(初级篇)
    python实现简单爬虫功能
    在python3.3后urllib2已经不能再用,只能用urllib.request来代替
    JSON
  • 原文地址:https://www.cnblogs.com/wx1993/p/4827518.html
Copyright © 2020-2023  润新知