• 掌握javascript中的最基础数据结构-----数组


    这是一篇《数据结构与算法javascript描述》的读书笔记。主要梳理了关于数组的知识。部分内容及源码来自原作。

    书中第一章介绍了如何配置javascript运行环境:javascript shell,不过我本人习惯使用sublime,所以直接在sublime中运行的。关于如何在sublime中配置环境请参考:

    https://my.oschina.net/ximidao/blog/413101#comment-list

    强烈建议把所有的代码都撸一遍以上。

    1.1   Javascript中对数组的定义

    数组的标准定义:一个存储元素的线性集合,元素可以通过索引来任意存取,索引通常是数字,用来计算元素之间存储位置的偏移量。
    不过javascript中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数。however,这些数字索引在内部被转换为字符串类型,是因为javascript对象中的属性名必须是字符串。

    2.2 使用数组

    2.2.1 创建数组

    • var nums = [1,2,3,4]; || 该方法效率更高
    • var nums = new Array(1,2,3,4);

    2.2.2 读写数组

    在一条赋值语句中,使用 [] 操作符将数据赋给数组,比如下面的循环,将1~100的数字赋给一个数组:

    var nums = [];
    for (var i =0; i<100;i++){
        nums[i] = i+1;
    }
    

    还可以用 [ ] 操作符读取数组中的元素:

    var nums = [1,2,3,4];
    var sum = nums[0]+nums[1]+nums[2]+nums[3];
    console.log(sum)
    

    2.2.3 由字符串生成数组

    var sentence = "the quick brown fox jumped over the lazy dog"; 
    var  words = sentence.split(" ");
    for (var  i=0; i<words.length;i++){
        console.log("word " + i + ":" +words[i]);
    }
    

    在上述程序中,调用 splite()方法,通过单词之间的空格分隔符,讲一句话分成及部分,并将每部分作为一个元素保存于一个新建的数组中。

    2.2.4 对数组整体性的操作

    1.将一个数组赋值给另外一个数组
    var nums = [];
    for (var i = 0; i<10;i++){
        nums[i] = i+1;
    }
    var samenums = nums;
    

    但是如上赋值操作,只是为被赋值的数组增加一个新的引用。当通过原引用修改了数组的值,另一个引用也会发生变化。

    var nums = [];
    for (var i = 0; i<10;i++){
        nums[i] = i+1;
    }
    var samenums = nums;
    nums[0] = 400;
    console.log(samenums[0]);  //显示400
    

    这种行为是浅复制,新数组依然指向原来的数组。
    更好的方案是深复制,将原数组中的每一个元素都复制一份到新数组中。

    //写个深复制函数
    function copy(arr1,arr2){
        for (var i = 0;i<arr1.length;i++){
            arr2[i] = arr1[i];
        }
    }
    var nums = [];
    for (var i = 0; i<10;i++){
        nums[i] = i+1;
    }
    var samenums = [];
    copy(nums,samenums);
    nums[0] = 400;
    console.log(samenums[0]);   //显示1
    

    2.3 存取函数

    2.3.1 查找元素 =====indexOf()

    用来查找传进来的参数在目标数组中是否存在。如果目标数组包含该参数,就返回元素在数组中的索引;如果不包含,就返回-1。

    2.3.2 数组的字符串表示 ===== join() 和 toString()

    这两个方法都返回一个包含数组所有元素的字符串,各个元素之间用逗号分隔开。

    2.3.3 由已有数组创建新数组 =====concat() 和 splice()

    concat()方法可以合并多个数组创建一个新数组。
    splice()方法截取一个数组的子集创建一个新数组。该方法第一个参数是截取的起始索引,第二个参数是截取的长度。

    var itDiv = ["Mike","Clayton","Terrill","Raymond","Cynthia","Danny","Jennifer"]; 
    var dmpDept = itDiv.splice(3,3);  // Raymond,Cynthia,Danny print(cisDept);
    var cisDept = itDiv; 
    console.log(dmpDept);// Mike,Clayton,Terrill,Jennifer
    

    2.4 可变函数

    2.4.1 为数组添加元素======push()和unshift()

    push()方法将一个元素添加到数组末尾。
    unshift()方法可以将元素添加到数组的开头。

    var nums = [2,3,4,5]; 
    console.log(nums); // 2,3,4,5 
    var newnum = 1;
     nums.unshift(newnum); 
     console.log(nums); // 1,2,3,4,5 
     nums = [3,4,5];
      nums.unshift(newnum,1,2); 
      console.log(nums); // 1,2,3,4,5
    

    2.4.2 从数组中删除元素 pop()和 shift()

    pop()方法可以删除数组末尾的元素。

    var nums = [1,2,3,4,5,9]; 
    nums.pop(); 
    console.log(nums); // 1,2,3,4,5
    

    shift()方法可以删除数组第一个元素。

    var nums = [9,1,2,3,4,5];
     nums.shift(); 
     console.log(nums); // 1,2,3,4,5
    

    pop() 和 shift() 方法都将删掉的元素作为方法的 返回值返回,因此可以使用一个变量来保存删除的元素:

    var nums = [6,1,2,3,4,5]; 
    var first = nums.shift(); // first gets the value 9 
    nums.push(first);
     console.log(nums); // 1,2,3,4,5,6
    

    2.4.3 从数组中间位置添加和删除元素=====splice()

    用splice()方法为数组添加元素,需提供如下参数:

    • 起始索引(就是希望开始添加元素的地方)
    • 需要删除的元素个数(添加元素时该参数设为0)
    • 想要添加进数组的元素
      such as:
    var nums=[1,2,3,7,8,9];
    var newElements = [4,5,6];
    nums.splice(3,0,newElements);
    console.log(nums);   //1,2,3,4,5,6,7,8,9
    

    下面是用splice()删除数组元素的例子:

    var nums = [1,2,3,100,200,4,5];
    nums.splice(3,2);
    console.log(nums);   //1,2,3,4,5
    

    2.4.4 为数组排序

    1.reverse() ====> 将数组中元素的顺序进行翻转
    2.sort() ======>对字符型的元素按字典顺序进行排序

    对于数字类型的元素,如果要用sort()排序,可以在调用方法时传入一个大小比较函数,排序时,sort()方法会根据该函数比较数组中两个元素的大小,来决定整个数组的顺序。

    function compare(num1,num2){
        return num1-num2;
    }
    var nums = [3,4,1,80,27];
    nums.sort(compare);
    

    sort()使用了compare()函数对数组按照数字大小进行排序,而不是按照字典顺序。

    2.5 迭代器方法

    2.5.1 不生成新数组的迭代器方法

    1.forEach()
    接受一个函数作为参数,并对数组中的每个元素使用该函数。
    
        function square(num){
          console.log(num,num*num);
        }
        var nums = [1,2,3,4,5,6];
        nums.forEach(square);
    
    2.every()

    接受一个返回值为布尔型的函数,对数组中的每个元素使用该函数。如果对于所有的元素,该函数都返回true,则该方法返回true。

    function isEven(num){
        return num%2 == 0;
    }
    var nums = [2,4,6,8];
    var even = nums.every(isEven);
    if(even){
        console.log("all numbers are even");
    }else{
        console.log("not all numbers are even");
    }
    

    可以改改数组里的元素试试。

    3.some()

    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) {    
            console.log("some numbers are even"); 
     } else {   
            console.log("no numbers are even");
       }
        nums = [1,3,5,7,9]; 
        someEven = nums.some(isEven); 
        if (someEven) {    
                console.log("some numbers are even");
         } else {    
              console.log("no numbers are even");
    }
    
    4.reduce()

    接受一个函数,返回一个值。该方法会从一个累加值开始,不断对累加值和 数组中的后续元素调用该函数,直到数组中的最后一个元素,最后返回得到的累加值。
    下 面这个例子展示了如何使用 reduce() 方法为数组中的元素求和:

    function add(runningTotal,currentValue){
        return runningTotal + currentValue;
    }
    var nums = [1,2,3,4,5,6];
    var sum = nums.reduce(add);
    console.log(sum);
    

    reduce() 方法和 add() 函数一起,从左到右,依次对数组中的元素求和。
    reduce() 方法也可以用来将数组中的元素连接成一个长的字符串:

    function concat(accumulatedString,tiem){
        return accumulatedString + item;
    }
    var words = ["the ", "quick ","brown ", "fox "]; 
    var sentence = words.reduce(concat);
    console.log(sentence);
    

    2.5.2 生成新数组的迭代器方法

    1. map()

    map() 和 forEach() 有点儿像,对 数组中的每个元素使用某个函数。两者的区别是 map() 返回一个新的数组,该数组的元素 是对原有元素应用某个函数得到的结果。

    function curve(grade){
        return grade += 5;
    }
    var grades = [78,89,92,74];
    var newgrades = grades.map(curve);
    console.log(newgrades);  // 83,94,97,79
    
    2. filter()

    filter() 和 every() 类似,传入一个返回值为布尔类型的函数。和 every() 方法不同的是, 当对数组中的所有元素应用该函数,结果均为 true 时,该方法并不返回 true,而是返回 一个新数组,该数组包含应用该函数后结果为 true 的元素。

    function passing(num) {    
            return num >= 60;
     } 
     var grades = []; 
     for (var i = 0; i < 20; ++i) {    
            grades[i] = Math.floor(Math.random() * 101); 
        }
     var passGrades = grades.filter(passing);
    console.log("All grades: "); 
    console.log(grades);
    console.log("Passing grades: "); 
    console.log(passGrades);
    
  • 相关阅读:
    Java 使用 EasyExcel 实现简单的读写操作
    Java上传文件到阿里云对象存储器OSS
    Springboot 项目解决跨域的问题
    Java 使用 Kafka 发布信息与消费消息
    安装PHPldapAdmin出现You don't have permission to access /phpldapadmin/ on this server.问题
    LDAP安装、LDAP数据迁移、LDAP卸载指南及PHPldapAdmin管理软件安装
    LDAP数据备份与数据恢复
    docker 启动所有镜像
    详解GET 和 POST请求的本质区别
    如何使用 markdown
  • 原文地址:https://www.cnblogs.com/qjqcs/p/5956097.html
Copyright © 2020-2023  润新知