数组,数组API
来源:互联网 发布:传奇技术联盟网络磁盘 编辑:程序博客网 时间:2024/06/08 06:17
一.数组
二.关联数组
三.数组API
四. 数组排序
五.栈和队列
- 数组:
什么是: 连续存储多个数据的存储空间,再起一个名字
多个变量的集合,起一个同一的变量名。
为什么: 程序=数据结构+算法
算法:程序执行的步骤!
数据结构:内存中数据存储的方式!
好的数据结构,可以极大提高程序的执行效率
如果一组相关的多个数据,只有集中存储,才便于管理和查找。
何时使用:集中存储多个相关数据时
如何使用:
创建: 5种:
(1). 数组直接量,
创建空数组: var arr=[];
创建同时初始化元素:var arr=[值1,….]
(2.) 实例化对象,
创建空数组: var arr=new Array();
arr.length -> 0
String(arr) -> “”
创建空数组,初始化元素个数:
var arr=new Array(n);
arr.length -> n
String(arr) -> ,,,,,,,…
创建数组同时初始化元素:
var arr=new Array(值1,值2…);
访问元素: 数组名[下标]
var arr=[ 1 , 2 , 3 , 4 , 5 , 6 ]
索引值 0 1 2 3 4 5
值 arr[i] arr[i+1] arr[i+2] arr[i+3] arr[i+4] arr[length-1]
长度(length)为最大索引下标值+1,如例子length为5+1
下标: 数组中唯一标识每个元素存储位置的序号
默认下标从0开始,连续不重复
最大下标永远是length-1.
数组中每个元素的用法和普通变量完全一样!
js中数组三特点:
1. 不限制元素个数!
访问不存在的下标:不报错!返回undefined
为不存在下标赋值:会在指定位置新建元素
自动修改length为最大下标+1
固定套路:
(1. ) 访问最后一个元素: arr[arr.length-1]
(2. )向数组末尾追加新元素:
arr[arr.length]=值;
arr.length自动被+1
<script> var num=[]; num[0]="happy"; num[1]="new"; num[2]="year"; num[3]="2016"; document.write(num);// happy,new,year,2016 num[num.length]="发大财"; document.write(num);// happy,new,year,2016,发大财 num[num.length]="hahah"; document.write(num);// happy,new,year,2016,发大财,hahah</script>
(3.) 缩容: 改小length属性,可删除结尾的元素
2. 不限制元素的数据类型! 数组是引用类型的对象: 引用计数器: 表示一个对象被几个变量引用的属性 垃圾回收进程: 检查并回收不再使用的对象的后台程序 专门检查引用计数器 一旦引用计数器为0,就释放对象。 如何主动释放对象:将引用对象的变量都设置为null 建议,只要用完较大的对象,都要主动释放
数组的length属性:记录了数组的元素个数;
length不能真实反映数组的元素个数
仅时最大下标+1而已。
数组的遍历: for(var i=0;i<arr.length;i++){ //当前元素: arr[i] } var num=[]; num[0]="happy"; num[1]="new"; num[2]="year"; num[3]="2016"; for(var i=0;i<num.length;i++){ document.write(num[i]); }// happynewyear2016 也可使用for in 遍历for(var i in num){ document.write(num[i]);}// happynewyear2016
关联(hash)数组:
什么是索引数组: 下标为数字的数组
什么是关联数组: 可自定义下标名称的数组
下标也称为元素的key
何时使用: 需要明确定义每个元素的名称和意义时
如何创建关联数组:
Step1. 先创建普通空数组: var fbb=[];
Step2. 向空数组中添加元素,自定义下标名
下标名必须是字符串:
fbb[“name”]=”范冰冰”;
fbb[“math”]=89;
fbb[“chs”]=61;
fbb[“eng”]=95;
如何访问关联数组元素:和访问索引数组完全一样
数组名[“下标名”]关联(hash)数组原理:
hash算法: 将给定的不同字符串,计算出尽量不同的序号
存入新元素: 将自定义下标名称交给hash算法计算一个唯一的序号。然后将值存入数组中序号指定的位置。
获取元素值: 将要查找的下标名交给hash算法,计算出和存储时完全相同的序号,直接到序号所在位置获取元素值。
hash数组最大优点: 查找效率极高!
无需遍历,和元素个数无关!
遍历关联数组: length属性失效,始终是0
for(var key in hash){//自动依次获取每个key hash[key]//获得当前元素值 } var num=[]; num["哈哈"]="happy"; num["嘻嘻"]="new"; num["呵呵"]="year"; num["呵呵呵"]="2016"; for(var i in num ){ document.write(i+" : "+num[i])}//i为key num为hash} //输出为:哈哈 : happy嘻嘻 : new呵呵 : year呵呵呵 : 2016
js底层,一切都是hash数组:
一切全局变量,对象的属性以及数组的元素,都可用[“key”]访问。
for in循环,即可遍历索引数组,也可遍历hash数组,也可遍历对象的属性。
但for循环,只能遍历索引数组
3. 数组API: API就是别人已经实现的现成对象或方法 程序员只需要使用,不需要关心原理。
1. arr to string:
var str=String(arr); 默认用逗号分隔每个元素值
var str=arr.join(“自定义连接符”);
如果省略自定义参数,默认和String相同(用逗号“,”)
固定套路: 1. 优化字符串拼接: 2步: Step1: 先将要拼接的子字符串放在数组中 Step2: 将数组一次性无缝拼接为字符串 无缝拼接: arr.join(""); 凡是频繁字符串拼接,都要用数组.join实现 栗子:将day02 homework中所有循环中的+=拼接,改为数组.join方式实现。 2. 将数组元素拼接为页面元素: 开始标签 +arr.join("结束标签开始标签") +结束标签 凡是批量替换父元素下所有子元素,就要先拼接为字符串,再放入innerHTML中。补上开头和结尾。
拼接:arr.concat()不修改原数组,生成新数组
返回值
返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。
var newArr=arr1.concat(值1,值2,arr2,…)
将参数中的值追加到arr1的值之后,返回新数组
参数中的数组会被打撒成单个元素,再拼接
<script type="text/javascript">var a = [1,2,3];document.write(a.concat(4,5));</script>输出:1,2,3,4,5<script type="text/javascript">var arr = new Array(3)arr[0] = "George"arr[1] = "John"arr[2] = "Thomas"var arr2 = new Array(3)arr2[0] = "James"arr2[1] = "Adrew"arr2[2] = "Martin"document.write(arr.concat(arr2))</script>
输出:George,John,Thomas,James,Adrew,Martin 截取子数组: arr.slice()**含头不含尾 不修改原数组,生成新数组从指定位置开始,到指定位置结束,截取中间的子元素,组成临时的新数组返回。请注意,该方法并不会修改数组,而是返回一个子数组。如果想删除数组中的一段元素,应该使用方法 Array.splice()。 var subArr=arr.slice(starti,endi+1);<script type="text/javascript">var arr = new Array(6)arr[0] = "George"arr[1] = "John"arr[2] = "Thomas"arr[3] = "James"arr[4] = "Adrew"arr[5] = "Martin"document.write(arr + "<br />")//输出:George,John,Thomas,James,Adrew,Martindocument.write(arr.slice(2,4) + "<br />")//输出:Thomas,James//含头不含尾document.write(arr)// 输出: George,John,Thomas,James,Adrew,Martin//原数组值不变</script>
一.数组API:
1. arr.splice(): 删除 插入 替换
删除: var deleted=arr.splice(starti,n)
强调: 直接修改原数组
starti是开始删除的位置
n是删除个数
deleted 接收被删除的元素组成的临时子数组
如果被删除的元素还有其他用途,就要继续保存
插入: arr.splice(starti,0,值1,值2,…)
在starti位置插入多个值
原starti位置的值向后顺移。
var arr = new Array(6)arr[0] = "George"arr[1] = "John"arr[2] = "Thomas"arr[3] = "James"arr[4] = "Adrew"arr[5] = "Martin"document.write(arr + "<br />")arr.splice(2,0,"William")//index2的值变成“William” 原本的值向后移变成index3的值document.write(arr + "<br />")</script>输出:George,John,Thomas,James,Adrew,MartinGeorge,John,William,Thomas,James,Adrew,Martin
替换: var deleted=arr.splice(starti,n,值1,…);
删除的元素个数n,不一定和新值个数相等。
也就是被删除的元素个数为n,新添加的元素个数不一定为n
强调:splice方法没有打散数组参数的功能
在本例中我们将删除位于 index 2 的元素,并添加一个新元素来替代被删除的元素:
var arr = new Array(6)arr[0] = "George"arr[1] = "John"arr[2] = "Thomas"arr[3] = "James"arr[4] = "Adrew"arr[5] = "Martin"document.write(arr + "<br />")arr.splice(2,1,"William")document.write(arr)输出:George,John,Thomas,James,Adrew,MartinGeorge,John,William,James,Adrew,Martin
在本例中我们将删除从 index 2 (“Thomas”) 开始的三个元素,并添加一个新元素 (“William”) 来替代被删除的元素:
<script type="text/javascript">var arr = new Array(6)arr[0] = "George"arr[1] = "John"arr[2] = "Thomas"arr[3] = "James"arr[4] = "Adrew"arr[5] = "Martin"document.write(arr + "<br />")arr.splice(2,3,"William")document.write(arr)</script>输出:George,John,Thomas,James,Adrew,MartinGeorge,John,William,Martin
二.翻转数组:arr.reverse();
var arr = new Array(3)arr[0] = "George"arr[1] = "John"arr[2] = "Thomas"document.write(arr + "<br />") //输出:George,John,Thomasdocument.write(arr.reverse())//输出:Thomas,John,George
数组排序:
手写冒泡排序算法:
function bubbleSort(arr) { var i = arr.length, j; var tempExchangVal; while (i > 0) { for (j = 0; j < i - 1; j++) { if (arr[j] > arr[j + 1]) { tempExchangVal = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tempExchangVal; } } i--; } return arr;}var arr = [3, 2, 4, 9, 1, 5, 7, 6, 8];var arrSorted = bubbleSort(arr);console.log(arrSorted);alert(arrSorted);//1,2,3,4,5,6,7,8,9
冒泡排序:从数组第一个元素开始 一次比较当前元素和下一个元素 如果当前元素>下一个元素 交换当前元素和下一个元素的值
- arr.sort():
默认将所有元素转为字符串PK Unicode (仅适合于对字符串内容排序)
如何自定义排序规则: 2步:
1. 自定义比较器函数: 专门比较任意两值大小的函数
要求: 1. 必须有2个参数
2. 必须返回一个数字
如果a>b,就返回正数
如果a
arr=[1,34,54,314,6544,44,52,]; function compare(a,b){return a-b;} var result=arr.sort(compare); document.write(result);//1,34,44,52,54,314,6544
原理: 函数也是对象 函数名其实仅是引用函数对象的变量 函数对象也可作为参数传递!不加(),只用函数名 任何情况下,函数名()都表示立刻执行函数,返回结果 执行效率: 浏览器的arr.sort方法进行过反复优化,执行效率比普通冒泡排序高的多! 所有,开发首选arr.sort(compare)
<script type="text/javascript"> function sortt(arr){ for(var i=0;i<arr.length;i++){ for(var j=0;j<arr.length-i-1;j++){ if(arr[j]>arr[j+1]){ var temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp;}}}} var arr=[1,2,5,77,55,11,845,774]; sortt(arr); console.log(arr) </script>
栈和队列:
js中没有专门栈和队列类型,其实都是用数组模拟的栈:一端封闭,只能从另一端进出的数组
FILO
结尾出入栈:
入: arr.push(值) 将 值 压入数组末尾
arr.push(parseInt(Math.random()*(max-min+1)+min));
上述列子为向arr数组中添加一个自然数
如需要添加多个(例子为添加10个),则需要使用for循环
for(var i=0,arr=[];i<10;i++){
arr.push(parseInt(Math.random()*(12-8+1)+8));
}
console.log(String(arr));
如果需要添加的在某个范围之间且数字不重复
如双色球(列子中为在1-33中选出6个不重复的数字)
function doubleBall(){ //声明空数组reds var reds=[]; //反复生成红球,只要reds的length<6,就要继续 while(reds.length<6){ // 在1~33之间生成一个红球号码,保存在red中 var red=parseInt(Math.random()*33+1); // 遍历reds中每个元素 for(var i=0;i<reds.length;i++){ //如果当前元素==red,就退出循环 if(reds[i]==red){ break; } }//(遍历结束) //如果i==length,就将red压入reds中 reds.push(red); }//(循环结束)
出: var last=arr.pop() 从数组 末尾 弹出1个元素 好处: 新出入栈元素,不影响其他元素的位置 开头出入栈: 入: arr.unshift(值) 将 值 插入到开头 出: var first=arr.shift(); 从数组 开头 弹出第1个元素 缺点: 每出入栈一次元素,其余所有元素的位置都要改变
何时使用栈: 保证始终使用数组中最新的元素时
队列: 只能从一端进入,从另一端出
FIFO
从结尾入队列: arr.push(值)
从开头出队列: var first=arr.shift()
何时使用队列: 希望按照先来后到的顺序使用数据时
- 数组,数组API
- 数组api
- 数组(API)
- javascript的数组API
- 数组对象常用API
- 【java】数组和API
- jQuery数组API【笔记】
- javascript之数组api
- 数组常用API
- JS 数组API
- 二维数组、字符串 API
- JavaScript 数组api
- JS-数组API
- js数组API总结
- 数组api+Dom+Bom
- js数组API--温故知新
- 【面向JS--数组API】
- 常用的数组API
- 43STL之集合算法
- swift3.1 快速上手系列(三)
- ffmpeg编译android的so库
- Java判断对象是否为空(包括null ,"")
- ui设计-文案(CW)
- 数组,数组API
- ACdream 1100 瑶瑶饿了(最短路+dp)
- boost交叉编译
- mysql常用语句、命令(增删改查功能)
- Unity投影(Raycast)相关的一些事
- 指定tomcat运行时JDK版本
- 每天一个Linux命令(第二)
- 循环队列实现
- 在安装ubuntu16.04双系统时,进入安装引导界面花屏