• 数据结构与算法之数组结构


    JS 的数组就是API的调用

    一.其他语言的数组的封装(比如Java的ArrayList)

    • 为什么js的数组不需要封装,而java的需要封装呢? :因为java中的数组结构相对来说比较底层,而js当中对数组的操作封装的很好
      • 常见的语言的数组不能存放不同的数据类型,因此所有在封装时通常存放在数组中的时Object类型
      • 常见语言的数组容量不会自动改变(需要进行扩容操作)
      • 常见的语言的数组进行中间插入删除操作性能比较低
    • 当其他语言进行中间插入的时候,后面的数据必须先全部一个一个全部往后移动一个位置,空出一个位置后,才能插入数据
    • 当其他语言进行删除的时候,还必须把后面的元素全部往前移动一个位置,因为删除了第一个元素,第一个是空的,通过索引0是取不到数据的,而后面的元素又不会动态的补上
    • 所以我们为什么还要使用数组呢?
      • 通过下标值取数据的时候,效率非常高,能够直接定位的那个数据,进行修改,和查询

    二. 数组API的常见操作

    定义一个数组 let numbers =[1,2,3,4,5,6]

    添加元素

    //在数组的最后一个位置添加元素
    numbers.push(11)  //1,2,3,4,5,6,11
    
    //在数组的头部位置添加一个元素
    for (var i = numbers.length; i > 0; i--) {
        numbers[i] = numbers[i-1]
    }
    numbers[0] = -1
    alert(numbers) // -1,1,2,3,4,5,6  (取到最后一个元素的后面一个位置,从后开始,将前面的一个赋值给后面一个,最后就空出头部位置了)
    

    删除元素

    // 删除最后的元素
    numbers.pop()  //1,2,3,4,5
    //删除头部的元素
    numbers.shift() //2,3,4,5,6
    

    任意位置的删除和修改

    //删除 指定位置的几个元素  (几个元素,不是第几个)
    numbers.splice(1, 2) //1,4,5,6
    
    //修改 指定位置的几个元素
    numbers.splice(1, 2, "a", "b") //1,a,b,4,5,6  
    这种操作会先删除,在添加写入的元素:先从索引1开始删除两个,在从删除的地方加上a,b两个元素
    eg:
    numbers.splice(1, 2, "a")  //1,a,4,5,6
    numbers.splice(1, 3, "a") //1,a,5,6
    

    常见的其他数组方法

    concats 连接两个或者更多数组,并返回结果
    every 对数组中的每一项运行给定函数,如果该函数对每一项都返回 true,则返回true, 否则返回false
    filter 对数组中的每一项运行给定函数,返回该函数会返回 true的项组成的数组
    forEach 对数组中的每一项运行给定函数。这个方法没有返回值
    join 将所有的数组元素连接成一个字符串
    indexOf 返回第一个与给定参数相等的数组元素的索引,没有找到则返回-1
    lastIndexOf 返回在数组中搜索到的与给定参数相等的元素的索引里最大的值
    map 对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组
    reverse 颠倒数组中元素的顺序,原先第一个元素现在变成最后一个,同样原先的最后一个元素变成了现在的第一个
    slice 传入索引值,将数组里对应索引范围内的元素作为新数组返回
    some 对数组中的每一项运行给定函数,如果任一项返回 true,则结果为true, 并且迭代结束
    sort 按照字母顺序对数组排序,支持传入指定排序方法的函数作为参数
    toString 将数组作为字符串返回
    valueOf 和 toString类似,将数组作为字符串返回

    数组的合并

    // 数组的合并
    var nums1 = [1, 2, 3]
    var nums2 = [100, 200, 300]
    var newNums = nums1.concat(nums2)
    alert(newNums) // 1,2,3,100,200,300
    

    迭代方法

    every()方法
    • every()方法是将数组中每一个元素传入到一个函数中, 该函数返回true/false.
    • 如果函数中每一个元素都返回true, 那么结果为true, 有一个为false, 那么结果为false
    • every()练习 :
      • 判断一组元素中是否 包含某一个字符
    // 定义数组
    var names = ["abc", "cb", "mba", "dna"]
    
    // 判断数组的元素是否都包含a字符
    var flag = names.every(function (t) {
        return t.indexOf('a') != -1 //indexof方法等于-1为没找到,找到了返回第一个索引
    })
    alert(flag)  //false
    
    some()方法
    • some()方法是将数组中每一个元素传入到一个函数中, 该函数返回true/false
    • 但是和every不同的是, 一旦有一次函数返回了true, 那么迭代就会结束. 并且结果为true
    • some()练习 :
      • 判断一组元素中是否 包含某一个字符
    // 定义数组
    var names = ["abc", "cb", "mba", "dna"]
    
    // 判断数组中是否包含有a字符的字符
    var flag = names.some(function (t) {
        alert(t)
        return t.indexOf("a") != -1
    })
    alert(flag)
    
    forEach()方法
    • forEach()方法仅仅是一种快速迭代数组的方式而已
    • 该方法不需要返回值
    • forEach的练习
    // 定义数组
    var names = ["abc", "cb", "mba", "dna"]
    
    // forEach的使用
    names.forEach(function (t) {
        alert(t)
    })  //弹出四次框 ,分别对应数组的每一项
    

    另外三个filter,map,reduce方法在关于js的随笔中有所阐述

  • 相关阅读:
    python基础——dict和set(字典和集合)
    python基础——循环(for,while,break,continue)
    python基础——条件判断
    python基础——list和tuple(列表和元组)
    python基础——字符串、编码、格式化
    Linux 新建线程 简单使用
    Android 原始套接字
    QTextEdit/QPlainTextEdit 等_默认的滚动条_宽度调节
    494. Target Sum
    670. Maximum Swap
  • 原文地址:https://www.cnblogs.com/JCDXH/p/11905948.html
Copyright © 2020-2023  润新知