javascript——数组篇

1、什么是数组?

数组的标准定义为:一个存储元素的线性集合(collection),元素可以通过索引来任意存取,索引通常为数字,用来计算元素存储位置的偏移量。 如果你有了解过其他语言,就会知道所有编程语言都有类似的数据结构。但javascript的数组和其他语言有所不同。JavaScript中的数组是一种特殊的对象,索引为该对象的素性,索引可能是整数。然而,这些数字索引在内部被转换为字符串类型,这是因为JavaScript对象的属性名必须是字符串类型。 数组在JavaScript中只是一种特殊的对象,所以效率上不如其他语言中的数组高。JavaScript中的数组,严格来说应该称作对象,是特殊的JavaScript对象,在内部被归类为数组。由于Array在JavaScript中被当作对象,因此它有许多属性和方法可以在编程时使用。

2、使用数组

JavaScript的数组十分的灵活有许多方法可以操作数组,在使用之前首先需要创建数组。

2.1创建数组

法一:通过[]操作符声明一个数组变量
var nums = []

这种方式创建的数组得到的是长度为0的空数组,可以通过数组的length属性来验证这一点

var nums = [1,2,3,4,5]

你也可以通过在[]操作符声明数组的同时,放入一组元素

法二:通过调用Array的构造函数创建数组
 let nums = new Array();
 console.log(nums.length)  //0

同理你也可以在声明时设置初始值:

 let nums = new Array(12345);
 console.log(nums.length)   //5

在调用Array的构造函数时,可以只传入一个参数,用来指定数组的长度:

 let nums = new Array(20);
 console.log(nums.length)   //20

2.2读写数组

    let arr = []  //声明
    let sums = 0
    for (let i = 0; i < 100; i++) {   //赋值
        arr[i] = i
    }
    arr.map((item, i) => {  //读取
        // console.log(item,i);
        sums += item
    })
    console.log(sums);   //4950
2.2.1 由字符串生成数组

调用字符串对象的split()方法也可以生成数组:

let str=`we are family !`
    let arr=str.split(" ")
    arr.map((item,i)=>{
        console.log(`arr${i}:${item}`);
        /*输出:
          arr0:we
          arr1:are
          arr2:family
          arr3:!
        */
    })
2.2.2 对数组的整体性操作

是将数组作为一个整体进行的。比如整体赋值:

    let arr = []  //声明
    for (let i = 0; i < 10; i++) {   //赋值
        arr[i] = i
    }
    let arr2 = arr

但是,使用这种方法把一个数组赋给另外一个数组时,只是为被赋值的数组增加了一个新的引用。当你通过原引用修改了数组的值,另外一个引用也会感知到这个变化,如:

 let arr = []  //声明
    for (let i = 0; i < 10; i++) {   //赋值
        arr[i] = i
    }
    let arr2 = arr
    arr[0]=100
    console.log(arr1[0])  //100

这种行为被称为浅复制,新数组依然指向原来的数组。一个更好的方案是使用深复制,将原数组中的每一个元素都复制一份到新数组中。如可以写一个函数来深拷贝(复制)数组:

    let arr1=[0,1,2,3,4,5,6,7,8,9],arr2=[]
    function CopyArr(arr1,arr2){
        arr1.map((item,i)=>{
            arr2[i]=item
        })
        return arr2
    }
    arr2=CopyArr(arr1,arr2)
    console.log(arr2);     // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    arr1[0]=100
    console.log(arr1[0],arr2[0]);  //100 0

2.3数组方法

1、JavaScript 方法 toString() 把数组转换为数组值(逗号分隔)的字符串。

2、join() 方法也可将所有数组元素结合为一个字符串。

3、pop() 方法从数组中删除最后一个元素。

4、push() 方法(在数组结尾处)向数组添加一个新的元素。

5、shift() 方法会删除首个数组元素,并把所有其他元素“位移”到更低的索引。

6、unshift() 方法(在开头)向数组添加新元素,并“反向位移”旧元素。

7、length 属性提供了向数组追加新元素的简易方法。

8、使用 delete 会在数组留下未定义的空洞。请使用 pop() 或 shift() 取而代之。

9、splice() 方法可用于向数组添加新项,也可删除数组中的元素。

10、concat() 方法通过合并(连接)现有数组来创建一个新数组。

11、slice() 方法用数组的某个片段切出新数组。

12、sort() 方法用于对数组的元素进行排序。

13、reverse() 方法用于颠倒数组中元素的顺序。

14、toLocaleString() 方法把数组转换为本地字符串。

15、valueOf() 方法返回 Array 对象的原始值。

具体用法可见: https://www.w3school.com.cn/jsref/jsref_obj_array.asp

2.4二维和多维数组

JavaScript只支持一维数组,但是通过在数组里保存数组元素的方式,可以轻松创建多维数组。

2.4.1创建二维数组

二维数组类似一种由行和列构成的数据表格。在JavaScript中创建二维数组,需要先创建一个数组,然后让数组的每个元素也是一个数组。我们需要知道二维数组要包含多少行,有了这个信息,就可以创建一个n行1列的二维数组了:

   let arr=[]
   let rows=5
   for(let i=0;i<rows;i++){
       arr[i]=[]
   }
   console.log(arr);   // [Array(0), Array(0), Array(0), Array(0), Array(0)]

这样做的问题是,数组中的每个元素都是undefined。更好的方式是遵照JavaScript: The Good Parts(O’Reilly)一书第64页的例子,Crockford通过扩展JavaScript数组对象,为其增加了一个新方法,该方法根据传入的参数,设定了数组的行数、列数和初始值。下面是这个方法的定义:

/*@ params
       numrows:行数
       numcols:列数
       initial:行列对应下的初始值
    */
    Array.matrix = function (numrows, numcols, initial) {
        let arr = []
        for (let i = 0; i < numrows; i++) {
            let columns = []
            for (let j; j < numcols; j++) {
                columns[j] = initial
            }
            arr[i] = columns
        }
        return arr
    }
    
    let nums = Array.matrix(5,5,0);
    console.log(nums[0][0])    //0

对于小规模的数据还是使用这种方式最简单,仅需一行代码即可:

 let nums = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
 console.log(nums[2][2]);   //9
2.4.2处理二维数组的元素

处理二维数组中的元素,有两种最基本的方式:按列访问和按行访问:

    let nums = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
    let total = 0
    for (let i = 0; i < nums.length; i++) {
        for (let j = 0; j < nums[i].length; j++) {
            total += nums[i][j]
        }
    }
    console.log(total) 

对于多维数组无非是,内循环控制行,外循环控制列。

2.5对象中的数组

在对象中,可以使用数组存储复杂的数据。

    function wageTemp() {
        this.dataSource = []
        this.add = add
        this.averag = averag
    }
    function add(data) {
        this.dataSource.push(data)
    }
    function averag() {
        let total = 0
        this.dataSource.map(item => {
            total += item
        })
        return total / this.dataSource.length
    }

    let gzTemp = new wageTemp()
    gzTemp.add(100)
    gzTemp.add(90)
    gzTemp.add(80)
    gzTemp.add(88)
    gzTemp.add(99)
    console.log(gzTemp.averag());    //91.4

(以上内容为阅读《数据结构与算法JavaScript描述》总结笔记,如有雷同,纯属巧合…)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值