我是靠谱客的博主 无私哈密瓜,最近开发中收集的这篇文章主要介绍JavaScript数据结构与算法——数组详解(上),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、JS中的数组

    JS中的数组是一个特殊的对象,用来表示偏移量的索引是该对象的属性,索引可能是整数,但是这些数字索引会在内部转换成字符串类型(因为JS对象中的属性名必须是字符串)。数组在JS中只是一种特殊的对象,效率不如其他语言中的数组高。

2、使用数组

    JS是一种灵活的语言,数组在JS中也是非常灵活的,接下来对数组的使用做一些总结。

2.1、创建数组

    要使用数组,第一步就是创建,js中创建数组有哪些方法?

    // 方法 ①
    var array = []
    // 方法 ②
    var array = [1, 2, 3, 4, 5]
    // 方法 ③
    var array = new Array()
    // 方法 ④
    var array = new Array(1, 2, 3, 4, 5)
    // 方法 ⑤
    var array = new Array(10)
    
    // 判断是否是数组
    Array.isArray(param)
    

解释:①与③均定义了一个空数组,③的方法是调用数组的构造函数创建数组。

        ②与④均定义了一个包含初始值的数组,④调用数组的构造函数,创建数组时传入初始值。

        ⑤创建了一个长度为10的数组。

需要注意的是:调用数组的构造函数创建数组时,传入的参数只有一个的话,指的是要创建的数组的长度。

此外,JavaScript数组中的元素不必是同一种数据类型,比如可以这样定义:

   var array = ["哈哈", 66, true, "hello"]

数组创建方法哪种好?大多数JS专家推荐使用[]操作符,和使用array的构造函数相比,这种方式被认为效率更高。

(此说法参见:《JavaScript:The Definitive Guide》)

2.2、读写数组

  2.2.1、数组赋值
    var array = []
    for (var i = 1; i <= 100; i++) {
        array[i-1] = i
    }

以上代码将1-100分别赋值给了array[0]-array[99],我们可以测试一下:

   console.log(array[0] + array[99])

相当于console.log(1 + 100),输出会是101。

  2.2.2、读取数组

以上对array进行了赋值,我们可以使用for循环读出数组中的每一项

    var sum = 0
    for (var i = 0; i < array.length; i++) {
        sum += array[i]
    }
    console.log(sum)

运行结果为5050。

2.3、由字符串生成数组

    调用字符串对象的split()方法可以生成数组,该方法通过一些常见的分隔符,比如空格,将字符串分成几部分,将每一个部分作为一个元素保存在数组中。比如:

    var string = "I am a javaScript developer from guangzhou"
    var array = string.split(' ')
    console.log(array)

运行结果如下:


2.4、对数组的整体性操作

    有些操作是将数组作为一个整体进行的,也就是整体性操作。

 2.4.1、浅复制

    将一个数组直接赋值给另一个数组后,修改其中一个数组的值,会造成另一个数组中的值也发生改变,这种行为被称为浅复制。因为数组是引用类型,新数组依然指向原数组,所以修改新数组会对原数组造成破坏,举个例子。

    var array1 = [1, 2, 3, 4, 5]
    var array2 = array1
    array2[0] = 100
    console.log(array1)

结果:


可见,将数组1直接赋值给数组2后,对数组2的修改会对数组1造成破坏。

 2.4.2、深复制

    深复制与浅复制相对,即深复制不会对原数组造成破坏,我们可以写一个函数,将原数组的每一项进行读取出来,再赋值给另一个数组,即可实现深复制。

    // 深复制函数
    function deepCopy(newArray, oldArray) {
        for (var i = 0; i < oldArray.length; i ++) {
            newArray[i] = oldArray[i]
        }
    }
    var array1 = [1, 2, 3, 4, 5]
    var array2 = []
    // 调用深复制函数
    deepCopy(array2, array1)
    // 修改array2中的值
    array2[0] = 100
    // 测试是否会对array1造成破坏
    console.log(array1)

运行结果:


可见,修改了array2中的值,也不会对array1造成什么影响。

3、存取函数

    JavaScript提供了一组用来访问数组元素的函数,叫做存取函数,这些函数返回目标数组的某种变体。

3.1、查找元素

 3.1.1、indexOf()

此函数是最常见的存取函数之一,用来查找传进来的参数在数组中是否存在,如果存在则返回该元素在数组中的索引值,如果不存在则返回-1。

    var array = ["C++", "JavaScript", "Java"]
    var a = array.indexOf('Java')
    var b = array.indexOf('Python')
    console.log(a) // 2
    console.log(b) // -1
3.1.2、lastIndexOf()

此函数返回相同元素最后一个索引,找不到的话返回-1,有兴趣可以写个例子测试一下。

3.2、数组的字符串表示

 3.2.1、join()

此函数用于将数组转换成字符串,join()中可以传入参数,比如join('-'),这样以后,数组元素将被转换成以-相连的字符串。

    var array = ["C++", "JavaScript", "Java"]
    var string = array.join('-')
    console.log(string)

结果:


 3.2.2、toString()

跟join()一样,用于将数组转成字符串,区别是join()可以指定数组元素间连接的符号,而toString()会使用逗号相连。

3.3、由已有数组创建新数组

 3.3.1、concat()

此方法可以通过合并多个数组新建一个数组,举个例子:

    var array1 = ["C++", "JavaScript", "Java"]
    var array2 = ["Nodejs", "大学英语", "王者农药"]
    var newArray = array1.concat(array2)
    console.log(newArray)

结果:


3.3.2、splice()

此方法可以通过截取某个数组的子集新建一个数组,举个例子:

    var array1 = ["Java", "Nodejs", "大学英语", "王者农药"]
    // 只传一个数字的话,代表从当前数字开始截到最后
    var newArray = array1.splice(0)
    // 传两个参数的话,第一个代表起始索引,第二个代表截取的长度
    var newArray1 = array1.splice(1, 2)
    console.log(newArray.toString())
    console.log(newArray1.toString())

为什么结果里newArray1.toString()是空数组???


解释:因为array1.splice(0)把array1中的值都截取到了newArray中,虽然array1.splice(1, 2)的原意是截取array1中索引为1到2的元素,但此时array1中已经没有元素,所以newArray1是一个空数组。

因此借助此方法,也可以对一个数组进行增加或移除元素操作。

4、可变函数

可变函数也可用于操作数组,与存取函数不同的是,可变函数不必引用数组中的某个元素,就能改变数组内容。这么神奇?让我们探索探索。

4.1、为数组添加元素

4.1.1、push()

此方法可以将一个元素添加到数组结尾,并返回添加成功后数组的长度。比较简单,直接在控制台演示好了。


4.1.2、unshift()

此方法可以将一个元素添加到数组开头,并返回添加成功后数组的长度。


4.2、从数组删除元素

4.2.1、pop()

此方法可以删除数组的最后一个元素,并返回被删除的元素的值


4.2.2、shift()

此方法可以删除数组的第一个元素,并返回被删除的元素的值


4.3、从数组中间位置添加和删除元素

4.3.1、再谈splice()

使用splice()添加数组元素时,可以传入三个参数:

    第一个参数为起始索引(要开始插入元素的地方,如果是0,则在0索引前开始插入)

    第二个参数为需要删除的元素个数,(不需要删就直接加的话,设置为0即可)

    第三个参数为想要添加进数组的元素

    var array1 = ["Java", "Nodejs", "大学英语", "王者农药"]
    array1.splice(1, 1, "哈哈哈")
    console.log(array1)

以上代码的意思为:删除索引为1的元素"Nodejs",并在索引1的元素前插入"哈哈哈",所以运行结果应该是

["Java", "哈哈哈", "大学英语", "王者农药"]

使用splice()删除数组元素在之前章节已经谈到过,不过还是举个例子加深一下:

    var array1 = ["Java", "Nodejs", "大学英语", "王者农药"]
    array1.splice(1, 1)
    console.log(array1)

解释:删除索引为1开始,之后的一个元素,也就是删除了"Nodejs",每次受伤害的都是Nodejs。。。splice()不传参数的话,全部都会删除。


4.4、为数组排序

4.4.1、reverse()

此方法用于将数组的原始排序倒转过来,举个例子:

    var array = ["Java", "Nodejs", "大学英语", "王者农药"]
    array.reverse()
    console.log(array)

是的,得到的是:


4.4.2、sort()

此方法按照字典顺序对元素进行排序,因此方法假定元素都是字符串类型(即使元素都是数字)。举些例子:

    var array = ["Java", "Nodejs", "English", "Algorithm"]
    array.sort()
    console.log(array)

执行结果为:


以上是元素是字符串的情况,假如元素是数字类型的话,直接调用sort()是不行的,比如:

    var array = [1, 2, 200, 3, 400, 100]
    array.sort()
    console.log(array)

结果为:


显然结果是不对的。怎么办呢?传入一个数字比较函数,比如升序的情况,数字两两对比,第一个比第二个大的话,调换位置即可,以下代码为了简便,我写成了匿名函数,你也可以选择抽出来:

    var array = [1, 2, 200, 3, 400, 100]
    array.sort(function (a, b) {
        return a - b
    })
    console.log(array)


这样以后,排序时就不会使用默认的字典排序。

篇幅似乎有点长了,剩余内容我们留到下篇再谈~~总结可能会存在一些问题,有的话欢迎指出O(∩_∩)O~~

周末愉快!!!

最后

以上就是无私哈密瓜为你收集整理的JavaScript数据结构与算法——数组详解(上)的全部内容,希望文章能够帮你解决JavaScript数据结构与算法——数组详解(上)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部