Javascript 数组

作者: ak1947 | 来源:发表于2018-07-28 20:53 被阅读0次

    Javascript 中的数组array是一种特殊的对象,数组下标可以视为对象的属性名称,注意js内部会将数组下标整数转换为字符以统一表示对象。

    数组对应类名称为Array,它包含了许多属性和函数方便用户使用。其中包括查询、排序等常见操作。


    创建数组

    1. 使用方括号 [ ] 操作符
    var numbers1 = [];
    print(numbers1.length);  // 输出长度为0
    var numbers2 = [1,2,3,4];
    print(numbers2.length); // 输出长度为4
    
    1. 使用构造函数Array()
    var numbers3 = new Array();
    print(numbers3.length); // 输出长度为0
    var numbers4 = new Array(1,2,3,4,5);
    print(numbers4.length);  // 输出长度为5
    
    var numbers5 = new Array(10);
    print(numbers5.length); // 输出长度为10
    

    注意构造函数参数多个时表示数组元素,一个参数时表示数组长度。

    1. 和许多脚本语言一样,数组元素不必是同种类型
    var objects = [1, "jessica", true, null];
    
    // 使用 Array.isArray()判断对象是否数组
    var n = 1;
    var nums = [1,2,5];
    print(Array.isArray(n)); // 输出false
    print(Array.isArray(nums));  // 输出true
    

    一些js专家建议尽量使用 [ ] 来创建数组,因为它更加高效。

    1. 从String创建数组
      var sentence = "The world is flat with Internet";
      var words = sentence.split(" ");
      for (var i = 0; i < words.length; i++) {
      print("word " + i + ": " + words[i]);
      }

    读取和写入数组元素

    1. 可以使用 [ ] 运算符,注意js数组长度由系统自动管理,不需要预先申请,元素默认值为null
    var nums = [ ];
    for (var i = 0; i < 10; ++i) {
        nums[i] = i+1;
    }
    var sum = nums[0] + nums[5] + nums[9]
    print(sum); // 输出16
    
    // 累加所有元素
    sum = 0;
    for (var i = 0; i < nums.length; ++i) {
        sum += nums[i];
    }
    print(sum); // 输出55
    
    1. js数组之间可以直接赋值(使用=),但注意赋值内容为引用(相当于C语言指针),对新数组内容的更改会反映到旧数组上
    var nums = [ ];
    for (var i = 0; i < 100; ++i) {
       nums[i] = i+1;
    }
    var nums2 = nums;
    nums2[0] = -100;
    print(nums[0]); // 输出-100
    
    1. 查找数组元素
    var names = ["David", "Cynthia", "Jennifer", "Cynthia"];
    print("Enter a name to search for:");
    var name = readline();
    var pos = names.indexOf(name);
    if (pos >= 0) {
        print("Found " + name + " at position " + position);
    }
    else {
        print(name + " not found in array.");
    }
    var lastpos = names.lastIndexOf("Cynthia");
    print(lastpos); // 输出3
    

    indexOf 返回数组下标,未找到时返回-1,如果有多个匹配,返回第一个下标,lastIndexOf从后向前查找,返回下标,未找到时返回-1

    1. 数组转换未字符串
    var names = ["David", "Cynthia", "Jennifer", "Cynthia"];
    var namestr = names.join();
    print(namestr); // 输出 David,Cynthia,Jennifer,Cynthia
    namestr = names.join(";
    namestr = names.toString();
    print(namestr); // 输出 David,Cynthia,Jennifer,Cynthia
    print(names);   // 输出 David,Cynthia,Jennifer,Cynthia
    

    join方法默认使用逗号连接所有数组元素,toString方法也使用逗号连接数组元素,print会自动调用toString方法

    1. 从已有数组产生新数组
    var names1 = ["David", "Cynthia", "Jennifer"];
    var names2 = ["Peter", "Bob", "Alice", "Cynthia"];
    var allnames = names1.concat(names2);
    print (allnames);  //  输出David,Cynthia,Jennifer,Peter,Bob,Alice,Cynthia
    allnames = names2.concat(names1);
    print(allnames);  //  输出Peter,Bob,Alice,Cynthia,David,Cynthia,Jennifer
    
    var firsttwo = allnames.splice(0, 2);    
    print(firsttwo);   // 输出Peter,Bob
    var lasttwo = allnames.splice(allnames.length-2, 2);
    print(lasttwo);   // 输出Cynthia,Jennifer
    

    concat将两个数组连接,splice从一个数组中指定位置提取指定个数元素

    1. 添加元素
    var nums = [1,2,3];
    nums.push(4);
    print(nums) ; // 输出 1,2,3,4
    nums.push(5,6);
    print(nums); // 输出1,2,3,4,5,6
    nums.push([7,8,9]);
    print(nums[6]); // 输出7,8,9
    
    nums.unshift(0);
    print(nums);  // 输出 0,1,2,3
    nums.unshift(-2,-1); 
    print(nums);  // 输出 -2,-1,0,1,2,3
    nums.unshift([-4,-3,-2]);
    print(nums[0]); // 输出-4,-3,-2
    print(nums.join(":")); // 输出-4,-3,-2:-2:-1:0:1:2:3:4:5:6:7,8,9
    

    push函数向数组尾部添加元素;unshift函数向数组头部添加元素,所有元素后移。注意可以同时添加多个元素,包括数组本身也可以作为元素添加进去

    1. 从两端删除元素
    var nums = [1,2,3];
    var last = nums.pop();
    print(nums); // 输出 1,2
    nums.push(last);
    print(nums); // 输出 1,2,3
    
    var first = nums.shift();
    print(nums); // 输出 2,3
    nums.unshift(first);
    print(nums); // 输出 1,2,3
    

    方法pop和push对应,用于删除数组尾部元素;方法shift和unshfit对应,用于删除数组首元素

    1. 从中间添加/删除元素
    var nums = [1,2,3,6,7,8];
    nums.splice(3, 0, [4,5]);
    print(nums); // 输出 1,2,3,4,5,6,7,8
    nums.splice(3,2);
    print(nums); // 输出 1,2,3,6,7,8
    vals = nums.splice(3,3,[4,5]);
    print(nums); // 输出 1,2,3,4,5
    print(vals);   // 输出 6,7,8
    

    splice将数组指定位置删除,并用新内容替代。只提供两个参数时只删除指定位置元素

    1. 元素逆序与排序
    var nums = [1,2,3];
    nums.reverse();
    print(nums); // 输出 3,2,1
    var letters = ["ab","ce","bc","def"];
    letters.sort();
    print(letters); // 输出ab,bc,ce,def
    
    var nums2 = [1,100, 2, 5, 300];
    print(nums2.sort()); // 输出 1,100,2,300,5  
    //  对数字排序时会出现错误,因为js内部用字符串表示数字
    function compare(n1, n2) {
        return n1-n2;
    }
    print(nums2.sort(compare)); // 输出 1,2,5,100,300
    

    使用reverse函数可以对数组元素逆序,使用sort函数可以对字符数组排序,其实是对象toString()后的内容。要对非字符串排序,需要自定义compare函数

    1. 迭代函数
    function square(n) {
        print(n, n*n);
    }
    var nums = [1,2,3,4,5];
    nums.forEach(square);
    // 输出下面内容
    1 1
    2 4
    3 9
    4 16
    5 25
    
    function isEven(n) {
    return n % 2 == 0;
    }
    var nums = [0,2,4,6];
    print(nums.every(isEven)) ; // 输出 true
    var nums = [0,1,2];
    print(nums.every(isEven)) ; // 输出 false
    print(nums.some(isEven));  // 输出true
    
    function add(total, current) {
        return total+current;
    }
    var nums = [1,2,3,4,5];
    print(nums.reduce(add)); // 输出 15
    
    var words = ["you", "are", "who"];
    function concat (accumulated, current) { 
        return accumulated + “ ” + current; 
    }
    print( words.reduce(concat));  // 输出 you are who
    print(words.reduceRight(concat)); // 输出 who are you
    
    
    var nums = [1,2,3];
    print(nums.map(function (v) { return v*v; });  // 输出  1,4,9
    var marks = [55,70,89,50,95,99,100];
    print(nums.filter(function (v) { return v>=60;}); // 输出 70,89,95,99,100
    

    二维和高维数组

    1.创建二维数组,js中的二维数组其实是一维数组,数组的元素仍然是数组

    var arr2d = [ ]; 
    arr2d[0] = [1,2,3];
    arr2d[1] = [4,5];
    arr2d[2] = [6];
    print (arr2d); // 输出1,2,3,4,5,6
    print (arr2d[0][2]); // 输出3
    print(arr2d[1].length); // 输出2
    

    第2维的长度可以变化

    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;
    }
    // 输出下面内容
    Student 1 average: 83.00
    Student 2 average: 79.67
    Student 3 average: 93.25
    

    上面程序计算学生成绩平均分并输出


    总结

    Javascript的数组非常灵活,它包含了堆栈、队列,和列表的常见接口,既能从两端增删元素,也能从中间增删元素;和其它脚本语言一样,js数组自动管理内存;js高维数组其实是一维数组的变形,即数组的数组;数组中内容排序时是按照字符(toString返回值)来的,对于数字或其它对象要自己定义比较函数;注意灵活使用数组的迭代器函数(forEach,every,some,reduce,filter等)可以提高编程效率,精简代码。

    相关文章

      网友评论

        本文标题:Javascript 数组

        本文链接:https://www.haomeiwen.com/subject/curamftx.html