16、数组

数组

数组的定义

es6新增了创建数组的方法form() of()

new Array(length/content);

var arr = new Array();
var arr = new Array(1,3,3,4,6)

字面量(推荐使用)

var arr =[,,];  // undefined x 2
var arr = [1,2,,,,3,4]; // 稀松数组 不是每位都有值 arr.length是7

两种定义方式的区别

// 只传一位参数 会默认是长度为10的空数组
var arr = new Array(10); 

// 这里就是一个数组里面只有一个值10  长度是1
var arr1 = [10]; 

var arr = new Array(10.2); // 报错  长度不能有小数  不合法
var arr = [10.2]  // 默认是值为10.2且长度为1的数组

数组的读和写(es3.0)

arr[num] //不可以溢出读(结果是undefined)

数组几乎不报错 因为数组是基于对象的 没有属性就会打印undefined

arr[num] = xxx; //可以溢出写

// 如果给一个空数组的第十一位赋值 就会把数组程度撑 长
arr[10] = "abc"  ==> "abc"  
arr ==> [undefined × 10,“abc”]

数组常用的方法

改变原数组(在原来的数组的基础上改变)

push, pop, shift, unshift,sort,reverse,splice

push:给数组中的最后增加元素

image-20221006173546880

注意:可以同时在数组最后添加很多位

image-20221006173708544

// 模拟push方法(了解)
var arr = [1,2,3];

// 注意不能传形参 因为可以push多个  不知道形参有多少个
Array.prototype.push = function () {  
    for(var i = 0; i < arguments.length; i ++){
   		this[this.length] = arguments[i];
    }
    return this.length;
}
pop:剪切数组中的最后一位
var arr = [1,2,3];

不可以传参数,传了也是默认剪切最后一位

arr.pop()返回3是因为是剪切 所以数组中还有三位 但是再访问arr时只有[1,2]

image-20221006174944724

shift:把数组的第一个元素删除
var arr = [1,2,3];

image-20221006175504785

unshift:在数组的最前面加元素

image-20221006175357396

reverse:逆转数组的顺序
var arr = [1,2,3];

image-20221006180239992

splice:截取数组长度,并添加新数据

arr.splice(从第几位开始,截取多少的长度,在切口处添加新的数据)

var arr = [2,1,8,4,5,2,0,9]

从第二位开始切(注意数组下标是从0开始),截取四位

image-20221006181307785

var arr = [2,1,8,4,5,7,0,9]
arr.splice(2,3,11,12,13,14,15,16)
访问arr:[2, 1, 11, 12, 13, 14, 15, 16, 7, 0, 9]

第三位表示从切口处替换截取的长度的数据(这里截取的数据是[8,4,5] 所以这三位被替换成插入的数据了)

image-20221006181739897

如果说只是需要单纯的插入数据,不希望替换截取的长度的数据,那就设置截取长度为0就好了

var arr = [1,2,3,5]
arr.splice(3,0,4)

注意:-1位就是倒数第一位

// 为什么-1是倒数第一位
var arr = [1,2,3,5];
splice = function (pos) {
    // 所在位置=-1+数组长度=-1+4=3  注意3是第四位 下标0开始
    pos += pos > 0 ? 0 : this.length;
}

image-20221006183541988

sort:给数组排序(升序)

想降序就可以在升序之后逆转数组(reverse)

image-20221006180558866注意这里会优先比较每个数组的ASCII,不是按照数字排序

image-20221006184553229

// 自己定义排序规则
var arr = [1,3,5,4,10]
// 冒泡排序
// 1.必须写俩形参
// 2.看返回值
//		1)当返回值为负数时,那么前面的数放在前面
//		2)为正数,那么后面的数在前
//		3)为0,不动
arr.sort(function (a,b) {
    /*if(a > b) {
        return 1;   	
    }else {
        return -1;
    }  下面的简写 直接返回return a - b;*/
    
    /* a > b ==> a - b > 0  a < b ==> a - b < 0
    所以不管升序接返回a-b  降序直接返回b-a */
    return a - b;
});

// 第一轮(1往后依次比较)
// 第一次传入1,3 1>3 false 所以返回-1 不需要变换1,3位置
// 第二次传入1,5 1>5 false 所以返回-1 不需要变换1,5位置
// 第三次传入1,4 1>4 false 所以返回-1 不需要变换1,4位置
// 第四次传入1,10 1>10 false 所以返回-1 不需要变换1,10位置

// 第二轮(3往后依次比较)
// 第一次传入3,5 3>5 false 所以返回-1 不需要变换3,5位置
// 第二次传入3,4 3>4 false 所以返回-1 不需要变换3,4位置
// 第三次传入3,10 3>10 false 所以返回-1 不需要变换3,10位置

// 第三轮(5往后依次比较)
// 第一次传入5,4 5>4 true 所以返回1 需要变换5,4位置 [1,3,4,5,10]
// 第二次传入4,10 4>10 false 所以返回-1 不需要变换4,10位置(注意数值变换之后就是变换之后的值往后进行比较)

// 第四轮(5往后依次比较)
// 第一次传入5,10 5>10 false 所以返回-1 不需要变换5,10位置

sort选择排序验证,完美!!!

var arr = [2,10,20,13,4,18,9]
arr.sort(function (a,b) {
    // 升序
    return a - b;
});

image-20221006192326042

var arr = [2,10,20,13,4,18,9]
arr.sort(function (a,b) {
    // 降序
    return b - a;
});

image-20221006192352097

练习一:给一个有序的数组,乱序
var arr = [1,2,3,4,5,6,7];
// Math.random()返回的是[0,1)之间的数
// Math.random() - 0.5就是可正可负的数
arr.sort(function (a,b) {
    return Math.random() - 0.5
});

数组顺序就会被打乱

image-20221006193325624

练习二:给对象按照年龄排序
var cheng = {
    name : "cheng",
    age : 18,
    sex : 'male' ,
    face : "handsome"
}
var deng = {
    name : "deng",
    age : 40,
    sex : undefined,
    face : "amazing"
}
var zhang = {
    name : "zhang",
    age : 20,
    sex : "male"
}

// 三个对象放到数组中
var arr = [cheng, deng, zhang];
arr.sort(function (a,b) {
    // 升序
    return a.age - b.age;
});

arr.sort(function (a,b) {
    // 降序
    return b.age - a.age;
});
练习三:按照字符串长度排序
var arr = ['ac','bcd','cccc','dddd','asdfkhiuqwe','asdoifqwoeiur','asdf'];
arr.sort(function (a,b) {
    // 升序
    return a.length - b.length;
});

arr.sort(function (a,b) {
    // 降序
    return b.length - a.length;
});
练习四:按照字节长度排序
function retBytes(str) {
    var num = str.length; // 字节长度就先默认等于字符串长度
    for(var i =0; i < str.length; i ++ ) {
        // ASCII大于255的字节长度加1 因为>255的是汉字 占两个字节
        if(str.charCodeAt(i) > 255){ 
        	num++;
        }
    }
    return num;
}

var arr = ['ac','bcd','cccc','dddd','asdfkhiuqwe','asdoifqwoeiur','asdf'];

arr.sort( function (a, b){
    // 升序
	return retBytes(a) - retBytes(b);
});

arr.sort( function (a, b){
    // 降序
	return retBytes(b) - retBytes(a);
});

image-20221006195934338

不改变原数组

concat,join——>split,toString,slice

concat:数组拼接
var arr = [1,2,3,4,5,6];
var arr1 = [7,8,9];
arr.concat(arr1)  // 把arr1拼接在arr数组上

注意拼接不会影响原数组 拼接完再访问arr和arr1又是原来的样子

image-20221006200403728

toString:把数组变成字符串展示出来

image-20221006200552283

slice:截取区间

slice(从该位(包含)开始截取,截取到该位的前一位)

从第一位(2)开始截取,截取到第三位(4)的前一位

image-20221006200806991

只写一个参数代表从第几位开始截取到数组最后一位

image-20221006201121223

不写参数就是整个数组都截下来,截取负数位就同前面一样 取负数加数组长度的值对应的位数

join:把数组中的每一位连接起来(参数只能传字符串)
var arr = [1,2,3,4,5,6];
arr.join("-");

image-20221006201556420

join应用
// 把下面的字符串拼接在一起  不需要连接符
var str = "alibaba";
var str1 = 'baidu';
var str2 = 'tencent';
var str3 = 'toutiao';
var str4 = 'wangyi';
var str5 = 'xiaowang';
var str6 = 'nv';

// 字符串放在栈中  后进先出  连接效率低
// 散列  (把字符串放到数组中 再通过数组进行连接)
var arr = [str,str1,str2,str3,str4,str5,str6];
arr.join("");  //传引号才是没有连接符,不传默认是逗号

image-20221006202519520

字符串方法split:按照什么把字符串拆分成数组

注意:字符串拆分成数组之后,数组中的值还是字符串类型

var str = arr.join('-');
str.split("-")

image-20221006201915897

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好学习_fighting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值