好家伙, 

 

在上一篇中,我们知道了,

JS的数组中每个槽位可以存储任意类型的数据

那么,我们能通过数组去模仿某些数据结构吗?

答案是肯定的

1.栈方法

ECMAScript 给数组提供几个方法,让它看起来像是另外一种数据结构。

数组对象可以像栈一样,也就是一种限制插人和删除项的数据结构。

栈是一种后进先出(LIFO,Last-In-First-Out)的结构,也就是最近添加的项先被删除。

数据项的插入(称为推入,push)和删除(称为弹出,pop)只在栈的一个地方发生,即栈顶。

ECMAScript数组提供了push()和pop()方法,以实现类似栈的行为。
push()方法接收任意数量的参数,并将它们添加到数组末尾,返回数组的最新长度。

pop()方法则用于删除数组的最后一项,同时减少数组的1ength值,返回被删除的项。

用法示例:

let colors = ["red", "blue", "green"]; //定义一个字符串数组
let cpush = colors.push("black");
console.log(colors,cpush); let cpop = colors.pop();
console.log(colors,cpop);

(这张图,没有十年画工画不出来)

2.队列方法

2.1.正队列

就像栈是以LIFO形式限制访问的数据结构一样,队列以先进先出(FIFO,First-In-First-Out)形式限制访问。

队列在列表末尾添加数据,但从列表开头获取数据。

因为有了在数据末尾添加数据的push()方法,所以要模拟队列就差一个从数组开头取得数据的方法了。

这个数组方法叫shift(),它会删除数组的第一项并返回它,然后数组长度减1。

使用shift()和push(),可以把数组当成队列来使用

用法示例:

let colors = ["red", "blue", "green"]; //定义一个字符串数组
let cpush = colors.push("black");
console.log(colors,cpush); let cshift = colors.shift();
console.log(colors,cshift);
console.log(colors,colors.shift());

 

2.2.逆队列

ECMAScript也为数组提供了unshift()方法。

顾名思义,unshift()就是执行跟shift()相反的操作:在数组开头添加任意多个值,然后返回新的数组长度。

通过使用 unshift()和pop(),可以在相反方向上模拟队列,即在数组开头添加新数据,在数组末尾取得数据, 

用法示例:

let colors = ["red", "blue", "green"]; //定义一个字符串数组
let cunshift = colors.unshift("black");
console.log(colors,cunshift); let cpop = colors.pop();//将出队元素重新插回队头
colors.unshift(cpop); console.log(colors,cpop);
console.log(colors,colors.pop());

(这张图,没有十年画工画不出来)

3.排序方法

 数组有两个方法可以用来对元素重新排序:reverse()和sort()。

3.1.reverse()反转数组方法

顾名思义,reverse()方法就是将数组元素反向排列。

用法示例:

let colors = ["red", "blue", "green"]; //定义一个字符串数组
colors.reverse();
console.log(colors);

 (貌似一些基础面试题会有类似的题目,叫你去反转某个数组,这么干就对了)

 

3.2.sort()排序方法

按照官方的说法,这是一个排序方法,

默认情况下,sort()会按照升序重新排列数组元素,即最小的值在前面,最大的值在后面。

为此,sort()会在每一项上调用string()转型函数,然后比较字符串来决定顺序。

但他并不总是能得到正确的排序

let colors = [99999,99,999,9999,9];
colors.sort();
console.log(colors); colors_1 =[9, 99, 999, 9999, 99999];
colors_1.sort();
console.log(colors_1); colors_2 =[0,1,5,10,15];
colors_2.sort();
console.log(colors_2);

 这里我们可以看到,第三个例子的排序错误了

为此,sort()方法可以接收一个比较函数,用于判断哪个值应该排在前面.

比较函数接收两个参数,

(1) 如果第一个参数应该排在第二个参数前面,就返回负值;

(2) 如果两个参数相等,就返回0;

(3) 如果第一个参数应该排在第二个参数后面,就返回正值。

function compare_1(valuel, value2){
if (valuel < value2){
return -1;
}
else if (valuel > value2) {
return 1;
}
else{
return 0;
}
}

返回-1就不进行交换,返回1将对两个值对调

colors_2 = [0, 1, 5, 10, 15];

//从小到大排序
function compare_1(valuel, value2){
if (valuel < value2){
return -1;
}
else if (valuel > value2) {
return 1;
}
else{
return 0;
}
} //从大到小排序
function compare_2(valuel, value2){
if (valuel < value2){
return 1;
}
else if (valuel > value2) {
return -1;
}
else{
return 0;
}
} console.log(colors_2.sort(compare_1));
console.log(colors_2.sort(compare_2));

 

如果数组的元素是数值,或者是其valueOf()方法返回数值的对象(如Date对象),这个比较函数还可以写得更简单,

更简便的写法:

colors_2 = [0, 1, 5, 10, 15];
function compare_3(value1, value2){
return value2-value1;
} function compare_4(value1, value2){
return value1-value2;
}
console.log(colors_2.sort(compare_3));
console.log(colors_2.sort(compare_4));

 

怎么说呢,感觉这个sort()设计的并不是很好,用起来并不是那么的方便,

要排序的话,或许直接写一个冒泡排序或者快速排序可以解决?

又或者是开发者故意开放一个比较函数来让我们编辑的?

JS-数组sort方法用的是哪种排序算法 - 简书 (jianshu.com)

等有了更多知识储备再来回答吧

第一百一十三篇: JS数组Array(二)数组方法 栈、队列、排序的更多相关文章

  1. “全栈2019”Java第一百一十三章:什么是回调?回调应用场景详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. JavaScript 数组(Array)对象的方法

    JavaScript 数组(Array)对象的方法 concat() 描述:用于连接两个或多个数组.该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本. 原型:arrayObject.conc ...

  3. js中数组Array对象的方法sort()的应用

    一. sort()方法的介绍 //给一组数据排序 var arrNum = [12,1,9,23,56,100,88,66]; console.log("排序前的数组:"+arrN ...

  4. 数组Array、数组API

    1.数组:批量管理多个数据的存储空间. 数组的作用:现实中,批量管理多个数据都是集中分组存放,良好的数据结构,可极大提高程序的执行效率! 优点:方便查找 2.创建数组:(4种方式) (1)var 变量 ...

  5. javasscript学习笔记 之 数组学习二 数组的所有方法

    1.push() 和 pop()  栈的方法 后进先出 push() 该方法是向数组末尾添加一个或者多个元素,并返回新的长度. push()方法可以接收任意数量的参数,把它们逐个添加到数组的末尾,并返 ...

  6. Javascript数组Array的forEach方法

    Javascript数组Array的forEach扩展方法 forEach是最常用到的数组扩展方法之一,相当于参数化循环数组,它简单的在数组的每一个元素上应用传入的函数,这也意味着只有存在的元素会被访 ...

  7. JavaScript中的内置对象-8--1.Array(数组)-Array构造函数; 数组的栈方法; 数组的转换方法; 数组的操作方法; 删除-插入-替换数组项; ECMAScript为数组实例添加的两个位置方法;

    JavaScript内置对象-1Array(数组) 学习目标 1.掌握任何创建数组 2.掌握数值元素的读和写 3.掌握数组的length属性 如何创建数组 创建数组的基本方式有两种: 1.使用Arra ...

  8. js 扩展Array支持remove方法

    /* * 方法:Array.remove(dx) 通过遍历,重构数组 * 功能:删除数组元素. * 参数:dx删除元素的下标. */ Array.prototype.remove = function ...

  9. 数组Array的一些方法

    数组对象属性和方法的概述:1> arr.push() 将参数添加至数组的末尾,返回的是新数组的长度2> arr.unshift() 将参数添加到数组的开头,返回新数组的长度3> ar ...

  10. 第一百一十七篇: JavaScript 工厂模式和原型模式

    好家伙,本篇为<JS高级程序设计>第八章"对象.类与面向对象编程"学习笔记   1.工厂模式 工厂模式是另外一种关注对象创建概念的创建模式. 它的领域中同其它模式的不同 ...

随机推荐

  1. [转帖]整理常用的 vim 命令

    vim 是一款功能强大的文本编辑器,它是Linux下常用的编辑器之一,对于熟练掌握了 vim 的人来说,用它编辑文件,方便又快捷,能极大的提高工作效率 vim 功能强大,对应的命令也非常的多,对于初学 ...

  2. [转帖]Systemd 指令

    一.由来 历史上,Linux 的启动一直采用init进程. 下面的命令用来启动服务. $ sudo /etc/init.d/apache2 start # 或者 $ service apache2 s ...

  3. pytest-数据驱动

    今天介绍两种实现数据驱动的方法,json和excel,我们以获取企业微信token接口为例,共 有两个参数corpid&corpsecret 一.json 方法一:@pytest.mark.p ...

  4. vue3动态组件的展示

    需求描述 有些时候,我们需要做这样的处理. 点击A按钮的时候,出现组件A 点击B按钮的时候,出现组件B 点击C按钮的时候,出现组件C 这个时候,我们就可以使用动态组件了 动态组件 <templa ...

  5. Stable Diffusion WebUI Model 加载个人笔记

    参考1:https://www.bilibili.com/read/cv20039815 参考2:https://blog.cmyr.ltd/archives/e740aac.html 服务器:阿里云 ...

  6. 玩一玩golang汇编

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 因为只是玩一玩,所以走的路线是:用C写代码,把C编译成AT ...

  7. 深入浅出Java多线程(二):Java多线程类和接口

    引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第二篇内容:Java多线程类和接口.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在现代计算机系统中,多线程 ...

  8. 知识蒸馏相关技术【模型蒸馏、数据蒸馏】以ERNIE-Tiny为例

    1.任务简介 基于ERNIE预训练模型效果上达到业界领先,但是由于模型比较大,预测性能可能无法满足上线需求. 直接使用ERNIE-Tiny系列轻量模型fine-tune,效果可能不够理想.如果采用数据 ...

  9. 《重学Java设计模式》作者开始录视频了!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 1. 前言 哈哈哈,终于对B站下手了! 大家好,我是小傅哥,在紧张.羞涩到适应后,哈哈哈,终于 ...

  10. SSM项目创建步骤(随手记)

    一.mybatis项目创建 1:创建maven项目 2:导入pom坐标 3:resources下创建SqlMapConfig.xml配置文件(主配置文件,配置数据库信息,映射配置文件等) 4:创建包及 ...