十五、数组基础、数组方法、数组排序

  • Post author:
  • Post category:其他




十五、数组基础、数组方法、数组排序



一 、数组基础



1.1 声明数组的三种方式



推荐(都用)数组字面量的形式创建数组

var arr1 = []; //数组字面量

// 系统内置的Array构造函数声明数组
var arr2 = new Array(); //不推荐
var arr3 = Array(); //不使用

所有的数组(不论哪种声明方式)都继承

Array.prototype

,其下的方法和属性都可以被继承使用。


声明对象的三种方式:(类比一下数组)


推荐使用对象字面的形式创建对象

var obj1 = {};//对象字面量

// 系统内置的 Object 构造函数声明对象
var obj2 = new Object();
var obj3 = Object();

所有的对象都继承

Object.prototype

,其下的方法和属性都可以被继承使用。



1.2 数组是一个特殊的对象



1.2.1

数组为什么是一个特殊的对象:



它和对象一样也是一个键名对应一个键值

,我们把数组中键名叫做数组元素的下标;

同时数组也是对象的一种有序体现

var arr = [1,2,3,4,5];
// 模仿数组声明一个对象
var obj = {
    0: 1,
    1: 2,
    2: 3,
    3: 4,
    4: 5
}
// 打印3
console.log(arr[2]); //3
console.log(obj[2]); //3



1.2.2

什么是数组下标:

​ 数组中每一个元素对应有一个位置,这个位置就是我们所说的下标,或者叫index索引。



1.2.3

为什么打印 数组[length]是

undefined

呢?

var arr = [1, 2, 3, 4, 5];
console.log(arr[5]); //undefined

因为数组相当于一个特殊的对象,访问对象不存在的属性时,返回

undefined

;访问数组[length]时,数组中并没有这个元素,所以也返回

undefined

var obj = {
    0: 1,
    1: 2,
    2: 3,
    3: 4,
    4: 5
}
console.log(obj[5]);//undefined



1.2.4 数组和对象一样可以进行增改查

var arr = [1,2,3,4,5];
arr[6] = 7; //增
arr[0] = 10; // 改
console.log(arr[0], arr); //查

数组的增改查



留一下删?



1.2.5

new Array()

创建数组

稀松数组:数组中有空值。


  • 使用内置构造函数声明数组时,数组中不能有空值



    数组中最后一个逗号后面的空值会被忽略。

    var arr1 = new Array( 2, 3, 7, );
    
  • 传一个数字参数x,构造出一个长度为x的数组;这个数组有元素,只是每个元素是空,叫empty [,]。

    var arr2 = new Array(5);
    
  • 如果传一个小数的话,报错信息:Invalid array length。

    var arr3 = new Array(5.2);
    
  • 传入一个字符串,把这个字符串当做元素放到数组中。

    var arr4 = new Array('a');
    

    new_Array



二、※ 数组方法



数组的专用方法都是从

Array.prototype

继承而来。

有些方法是来自Array的静态方法,比如:

Array.isArray()

用于确定传递的值是否是一个


Array


这里记录修改原数组的

7

个方法:

push 和 unshif

pop 和 shift

reverse

splice

sort



2.1 ※push和unshift


功能:

  • push()在数组末位添加元素
  • unshift()在数组首位添加元素


返回值:

执行方法以后的数组长度。


参数:

可以传多个或一个:


push(5,6,7) unshift(1)

var arr = [2,3,4];
console.log(arr.push(5,6,7),arr);
console.log(arr.unshift(1),arr);

push_shift

自己实现push方法:

var height = [180, 177];
// 自己实现push方法
Array.prototype.myPush = function(){
    for(var i = 0; i < arguments.length; i++){
        this[this.length] = arguments[i]; 
        //谁调用它,this指向谁,这样所有数组都可以使用这个函数
    }
    return this.length; //返回执行后的数组长度
}
console.log(height.myPush(178, 180), height);

return 还是返回执行方法以后数组的长度。

自己实现push方法



2.2 ※pop和shift


功能:

  • pop()剪切数组最后一位元素
  • shift()剪切数组第一位元素


返回值:

被剪切的一位元素。


参数:

var arr = ['a', 'b', 'c', 'd'];
console.log(arr.pop(), arr);
console.log(arr.shift(), arr);

var height = [180, 177];
var h = height.pop();
console.log(h);

可以用一个变量去接收一个被剪切的元素。

push_shift



2.3 ※splice



2.3.1 splice的基本使用


功能:

  • 删除(剪切)数组指定相邻元素;
  • 替换元素(删除的同时在删除的位置上增加元素);
  • 只增加元素;


返回值:

被剪切元素组成的数组。


参数:

2+n个

前两个参数的含义是:开始项的下标;剪切长度。

之后的参数代表插入的元素。

  • 删除数组中的指定相邻元素(只传入2个参数):

    var arr = ['a', 'b', 'c', 'd'];
    console.log(arr.splice(0, 2), arr);
    

    splice1

  • 替换元素(传入2+n个参数)

    var arr = ['a', 'b', 'c', 'd'];
    console.log(arr.splice(1,2,'white','rose'), arr);
    

    splice2

  • 只增加元素(传入2+n个参数):

    var arr = ['a', 'b', 'c', 'd'];
    console.log(arr.splice(3,0,'pig','dog'), arr); 
    

    splice3



总结:无论是删除/插入都可以看做,从开始项下标的元素与前一个元素之间开始计算剪切长度,之后改变数组。



2.3.2 splice怎么判断元素的位置

splice的首位参数可以传负值

var arr = ['a', 'b', 'c', 'd'];
console.log(arr.splice(-1, 1),arr);

splice负值

而数组访问元素时,下标从0开始为0,1,2…都为正值;

splice中开始项下标的取正负的逻辑处理过程:

var arr = ['a', 'b', 'c', 'd'];
function splice(arr, index){
    return index > 0 ? index
                     : index + arr.length;
}
console.log(arr[splice(arr, -1)]); // 'd'
console.log(arr[splice(arr, -2)]); // 'c'



2.4 reverse


功能:

使数组倒序。


返回值:

被倒序的数组。


参数:

var arr = [2,3,4,5,6];
console.log(arr.reverse(), arr);

reverse



三、数组排序



3.1 sort



3.1.1 基本用法



功能:按照ASCII码升序排序。


返回值:

排序以后的数组。


参数:

var arr = [8, 7, 9, 5, 1, 2];
var arr2 = ['b', 'z', 'a', 'h', 'j'];
var arr1 = [27, 49, 5, 7];
console.log(arr.sort(),arr);
console.log(arr2.sort(),arr2);
console.log(arr1.sort(),arr1);

sort1

​ sort排序时,把数字变成字符串,按照ASCII码升序排列,从前往后一个字符一个字符的一 一 比较,前面的字符比较有结果,则不再比较后面的字符。



※3.1.2 自定义数组排序方法


返回值:

  1. 负值,a排在前面
  2. 正值,b排在前面
  3. 0,保持不动


参数:

两个参数a,b;必须有。

a代表数组中前一个元素,b代表数组中后一个元素。

比较方式:循环比较相邻的两个值,达到冒泡排序的效果。

升序排序形式:

var arr = [27, 49, 5, 7];
arr.sort(function(a, b){
    if(a > b){
        return 1;
    }else {
        return -1;
    }
});
console.log(arr);

也可以简写成:

var arr1 = [27, 49, 5, 7];
arr1.sort(function(a, b){
    return a - b;
});
console.log(arr1);

如果a>b,则return的a-b>0,即return一个正值。

b就排在前面,即小值排在前面,数组升序。

sort2

只要逻辑保持一致,排序后的数组是一样的。

注:

公司注重代码的可读性,并不是代码写的越少越好



3.1.2 随机排序

使用自定义数组的形式。

使用方法:

Math.random()

,随机返回一个(0,1)开区间的数字。

arr.sort(function(a, b) {
    if(Math.random() > 0.5){
        return 1;
    }else {
        return -1;
    }
})
//简写形式
arr.sort(function(a, b) {
    return Math.random() - 0.5;
})
console.log(arr);

如果

Math.random()

大于0.5,就把这个值往后放,sort的自定义函数就return 正值。



※ 3.1.3 按照数组中对象的某个属性排序

按照数组中对象的num属性升序排列:

var friends = [
    {
      name: 'rose',
      num: 25
    },
    {
      name: 'jordan',
      num: 45
    },
    {
      name: 'kobe',
      num: 41
    },
];
// 按照数组中对象的num属性升序排列
friends.sort(function(a, b) {
    if(a.num > b.num){
        return 1;
    }else{
        return -1;
    }
});
console.log(friends);

按照数组中对象的某个属性值排序



3.1.4 按照数组中元素字符串长度排序

按照数组中元素字符串长度升序排序:

var arr = ['12345,', '1', '123', '14', '1,']; 
arr.sort(function heihei(a, b ) {
    if(a.length > b.length){
        return 1;
    }else{
        return -1;
    }
});
console.log(arr);

按照数组中字符串长度排序



版权声明:本文为weixin_44683942原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。