发表于: 2019-12-06 21:05:01

1 1302


今日完成:

数组
什么是数组?
数组对象是使用单独的变量名来存储一系列的值。
数组存在场景,应用意义
ex:
有一组数据(例如:车名字),存在单独变量如下所示
var car1="Saab";
var car2="Volvo";
var car3="BMW";
... ...
总结(描述):如果想从中调取一辆车,是简单地,3个数据选一个,如果是300个数据选一个呢?声明300个变量?
这时,就体现出数组存在的意义,只需要声明一次变量,就把这些数据都包含进去,用索引值
(数组每个元素都有一个按顺序得到的索引值从零开始独一无二,变相的变量名))调取,
极大的简化了声明变量的步骤,且便于调取
-------------------------------------------------
创建数组的三种方法:(还是上述例子,三辆车)
下面的代码定义了一个名为 myCars的数组对象:
1: 常规方式:
var myCars=new Array();
myCars[0]="Saab";       
myCars[1]="Volvo";
myCars[2]="BMW";
2: 简洁方式:
var myCars=new Array("Saab","Volvo","BMW");
3: 字面:
var myCars=["Saab","Volvo","BMW"];
-------------------------------------------------------
访问(调取)数组某个元素的方式:
访问myCars数组的第一个值:
var name=myCars[0];
描述:这时变量name的值,就是数组myCars中的第一个值Saab,也可以myCars[0]直接调取数组的第一个元素.
修改了数组 myCars 的第一个元素:
myCars[0]="Opel";
描述:这时数组的第一个元素,就由Saab变成了Opel,类似为同一个元素设置两种不同的颜色,后一个颜色覆盖(修改)前一个颜色,
ps:
1.因为浏览器读取js与html相同,所以要注意输入顺序.
2.[0] 是数组的第一个元素。[1] 是数组的第二个元素。
-----------------------------------------------------------
在一个数组中可以有不同的对象
所有的JavaScript变量都是对象。数组元素是对象。函数是对象。
因此,可以在数组中有不同的变量类型。
可以在一个数组中包含对象元素、函数、数组:
myArray[0]=Date.now;
myArray[1]=myFunction;
myArray[2]=myCars;
总结:数组中的元素不限制类型,甚至数组中某一个元素的值可以是另一个数组
-------------------------------------------------------------------------------------
数组方法和属性
使用数组对象预定义属性和方法:
var x=myCars.length                     // myCars 中元素的数量
var y=myCars.indexOf("Volvo")   // "Volvo" 值的索引值
ps:更多方法:
合并两个数组 - concat()
合并三个数组 - concat()
用数组的元素组成字符串 - join()
删除数组的最后一个元素 - pop()
数组的末尾添加新的元素 - push()
将一个数组中的元素的顺序反转排序 - reverse()
删除数组的第一个元素 - shift()
从一个数组中选择元素 - slice()
数组排序(按字母顺序升序)- sort()
数字排序(按数字顺序升序)- sort()
数字排序(按数字顺序降序)- sort()
在数组的第2位置添加一个元素 - splice()
转换数组到字符串 -toString()
在数组的开头添加新元素 - unshift()
ps:个人理解:方法就是函数,一些常用的函数,约定俗成,达成一致的使用规范,就成了方法
-------------------------------------------------------------------------------------------------------------------------------
数组乱序
sort()方法
定义和用法
sort() 方法用于对数组的元素进行排序。
排序顺序可以是字母或数字,并按升序或降序。
默认排序顺序为按字母升序。
ps:
1.当数字是按字母顺序排列时"40"将排在"5"前面。
2.使用数字排序,必须通过一个函数作为参数来调用。
函数指定数字是按照升序还是降序排列。
这种方法会改变原始数组!。
语法:array.sort(sortfunction)
参数 Values
描述:sortfunction 可选。规定排序顺序。必须是函数。
返回值Type
描述:Array  对数组的引用。ps:数组在原数组上进行排序,不生成副本(直接改变原来的数组)。
ex:
数字排序(数字和升序):

数字排序(数字和降序):

数字排序 (字母和降序):

总结:
1.数字排序,声明一个数组,数组名写在sort()前方,用点连接:数组名(变量名).sort(function(a,b){return a-b});
sort()括号内的函数,暂时先看成让数组中的数字由小到大(由大到小)排序的固定函数句式,
ps:因为读不懂函数function(a,b){return a-b}的意义,暂时先这么理解
点击事件,触发函数,开始运行,就在原本的数组上进行排序,函数运行完,输出这时的数组,就是排序后的数组,
数组名(array).sort(function(a,b){return a-b});//数组中的数字从小到大排序(升序)
数组名(array).sort(function(a,b){return b-a});//数组中的数字从大到小排序(降序)
2.字母排序,与数字排序类似,但是sort(),括号内不需要函数,默认值就是字母升序(A到Z)
降序需要用到另一个方法:reverse(),用在这里,就是把sort(),排好的字母升序颠倒(变为字母降序,Z到A)
ps:定义和用法:reverse() 方法用于颠倒数组中元素的顺序。
array.sort();//默认字母升序,数组中的字母A到Z
array.sort();
array.reverse();//与方法sort()组合,顺序颠倒就成了字母降序Z到
ps:
1.数字是用函数,字母是用方法组合,需要分别记住
2.字母排序,如果每个元素都是单词组成的字符串,就按首字母排序,区分大小写,且安升序排序小写字母在大写字母之后,
3.有相同字母,升序按原本在数组的位置(数组有语法错误,函数是不运行的)
------------------------------------------------------------------------------
查看数组乱序方法时,发现sort()括号内,就算没有有函数,也能输出数字,(不是升序,也不是降序)
就有设置demo
证明:数组名(array).sort(function(a,b){return a-b})
array中,不管有多少个数字元素,或者是几位数,都会正确的从大到小排列(包括小数,负数,分数,更多位的数)
ps:想098这种,前面带无效字符串0的数字,输出时,会忽略掉0,输出98,想分数(计算)如1/2,1+1000000这种,输出结果,以结果0.5,和1000001参与排序
显示:

扩展:插入排序和快速排序的原理(思想,原生js)
都以升序举例:
插入排序:
数组a[...]中有一组无序的数字
假设数组a[...]的第一个元素a[0],插入另一个空数组,b[...]中
在抓取a[]的第二个元素a[1],插入b[]中去,
在此过程中,进行判断:
a[1]>=a[0]时,
这个元素,在数组b[]中,就排在a[0]的后面,
a[1]<a[0]时,
a[0]及后面的元素(如果有).向后移动一位
a[1]插入空缺的位置
... 
以此类推
遍历抓取数组a[]的元素,插入数组b[]中去,
上面两步判断,遍历数组b[]所有元素,
直到插入元素,插入数组b[]移动后空缺的位置,或者插入数组b[]最后一位
得到的数组b[]就是数组a[]内部元素的升序排列的数组
ps:插入排序的时间复杂度为O(n^2)。是稳定的排序方法
-------------------------------------------------------------------------------------------------------
快速排序:
数组a[...]中有一组无序的数字
以数组a[]第一个元素a[0]作为基数判断,
与a[0]后面的所有元素挨个比较(遍历数组和a[0]比较)
小于a[0]的元素导入一个新的空数组b[]中
大于等于a[0]的元素导入另一个新的空数组c[]中
...
同理
以数组b[]的第一个元素b[0]为基数判断,
与b[0]后面的所有元素挨个比较
小于b[0]的元素导入一个新的空数组b1[]中
大于等于b[0]的元素导入另一个新的空数组b2[]中
直到不能再分解为止.
c[...]同理
然后把得到的数组基数从小到大从新组合成一个新数组a2[...]
数组a2[...]就是数组a[]内部元素的升序排列的数组
ps:这种方法虽然符合快速排序的思想,但是会在递归过程中创建大量的数组存放数据,
当数据量过大的时候会造成 Allowed memory size of 134217728 bytes exhausted也就是内存耗
总结:
1.代码暂时写不了,只能先理解思想,用自己的话叙述
2.至于菜鸟教程中的数字排序,字母排序的原理,只能先记住了
3.插入排序和快速排序的差别:插入排序的效率比快速排序的效率要低。
//------------------------------------------------------------------------------
乱序:
一般比较经典且流行的方案为:对对象数组采用array.sort()方法,并传入一个比较函数(comparison function),这个比较函数随机返回一个介于[-0.5, 0.5]之间的数值:
var numbers = [12,4,16,3];
numbers.sort(function() {
return .5 - Math.random();});
思考了很久,也没明白函数什么意思,只能理解到返回[-0.5,0.5]至于怎么通过这个值比较搞不懂,这个是连运作原理都想不明白,先保留
------------------------------------------------------------------------------------------------------------------------------------------------------
另一个乱序,目标数字可以是数组也可以是字母
基于Fisher–Yates shuffle洗牌算法
原理:
1.一个数组,随便数字还是字母,有序还是无序,这个乱序用的是元素的索引值(序号)
ex:假如有9个元素

从数组末尾开始,选取最后一个元素。

在数组一共9个位置中,随机产生一个位置,该位置元素与最后一个元素进行交换。

同理:
已经把数组末尾元素进行随机置换。
接下来,对数组倒数第二个元素动手。在除去已经排好的最后一个元素位置以外的8个位置中,随机产生一个位置,该位置元素与倒数第二个元素进行交换。

例子中的代码:

原理搞明白了,但是设置demo,没显示,要么报错,暂时先保留
-----------------------------------------------------------------------------
但是,写到这里突然醒悟,想起js-1,九宫格随机颜色的错误做法,
随机了一个数字(颜色数组长度的随机数),
设置一个空数组,抓取颜色数组中数字索引值代表的颜色到空数组中,
然后删除,原颜色数组中的这个颜色,
操作3次得到一个9选3的随机颜色.
在这里同样可以,只不过遍历原数组,重新得到一个新数组
,与上述的洗牌做法异曲同工
//------------------------------------------------------------------------------------------
js3制作想法
1.已经做出了根据总的输入值,分配杀手和平民,
所以,设置一个空数组,设置一个循环,让值自加,循环次数,是分配的杀手(平民)的value值,
返回空数组,然后再让两个数组合并,就是一个包含杀手和平民的数组
2.如何让包含杀手平民乱序(随机)排列,这里陷入思维误区,想成了直接作用与数组内部的元素本身,
直到做到洗牌算法时,突然醒悟,还是要作用到索引值,还是要用到随机数
3.方法一:
原本想的是一共18个数,我搞一个0~17的18个数字的随机数组, 然后有输入的总数,
运用正则表达式exec()
,比如总数是5,就把随机数组中0~17中的0~5按照随机数组中的顺序打印出来,然后设置一个空数组,
原平民加杀手数组的元素,按照打印出的随机数序号排列
突然发现不行
原因:exec()
是按照原本写入的顺序,打印的,比如写1,2,3,4,5,要么打印出来还是1,2,3,4,5要么报错.
突然发现自己想复杂了,可以把方法一简化
按1步骤得到一个数组a[],元素包换平民和杀手,数量是输入框的总人数,
用Math.random()的方法,得到一个输入框value-1,或者a.lenght-1或者floor(),得到一个随机数组b[]
设置数组c[],把数组a中的元素,艺术组b[]中的随机数为索引值填入
即:c[a[b[0]],a[b[1]]...]遍历数组b[],得到一个平民和杀手随机排列的数组c[...]
方法二:
就是按照上述的,之前任务一,颜色随机错误做法的9选3来做,只是这次遍历数组a[...],9选9,相当于把原本数组a[]中的元素随机排列
遇到问题:
思考有误,把原本简单的问题想复杂了,醒悟过来后,就简单了
收获:
1.在做完任务一,再来总结数组的含义,就自然的用自己的话给写出来了
2.看排序,升序,降序,乱序
升序,降序都有方法,乱序的方法我没找到
但是菜鸟教程中出的方法,具体函数过程不了解,(就是a-b之类的,看不懂),
但是用原生js写函数,排序,关于数字的部分,原理的部分,升序降序方法找到了两个,并且能用自己的话总结原理,但是实现操作知识不够用,
关于乱序,原生js放法理解原理并且能实际应用的,两种,如上所示
明日计划:继续js-3



返回列表 返回列表
评论

    分享到