数组排序,"栈",二维数组,StringAPI(toUpperCase,toLowerCase,charAt,charCodeAt,slice,substring,indexOf)-07

2016-08-29-day07 am


排序:

1.自定义排序算法: 冒泡,插入,快速

冒泡: 从头开始遍历数组中每个元素,如果当前元素>下一个元素, 就交换两数的位置。
交换两变量值的方法:a,b
1. 声明第三个变量:
var t=a; a=b; b=t;
2. 不声明第三个变量: 仅能交换数字
a+=b; b=a-b; a-=b;
3. 不声明第三个变量: 万能
b=[a,a=b][0];

以下是一个冒泡排序的例子

function bubbleSort(arr){
//r从1开始,到下一个元素
    if(arr[i]>arr[i+1]){
      //交换当前元素和下一个元素的位置
      //方法1: a+=b; b=a-b; a-=b;
      //方法2: b=[a,a=b][0];
      arr[i+1]=
        [arr[i],arr[i]=arr[i+1]][0];
    }
  }
}
}
var arr=[4,2,5,1,7,3,6];
bubbleSort(arr);
console.log(String(arr));//[1,2,3,4,5,6,7]
2.使用排序API:

arr.sort(); 默认,但是仅能对字符串升序排列

解决: 自定义比较器函数:专门用来比较任意两数大小的函数。

  • 要求:
    1). 2个参数,a,b
    2). 如果a>b,就返回正数
    如果a 如果a==b,就返回0

  • 最简单的数字比较器: function cmp(a,b){return a-b;}

  • 如何使用比较器函数:将比较器函数对象,作为sort方法的参数
    arr.sort(cmp);
    以下是一个简单的例子

var arr=[12,3,23,2,123,1];
//Step1: 定义比较器函数
function cmp(a,b){return a-b;};
//function cmp(a,b){return -(a-b);};
//Step2: 将比较器函数作为参数传入sort方法
arr.sort(cmp);
console.log(String(arr)); //[1,2,3,12,23,123]
  • 降序排列: 颠倒比较器返回值的正负 function cmp(a,b){return -(a-b)};

强调: cmp后,不要加()
加()与不加()的区别: 不加(),是将函数对象放入sort中,sort可反复调用执行。加(),仅是将函数的执行结果,放入sort中,sort方法无法反复调用。

栈和队列:

js中没有专门的栈和队列类型,都是用普通该数组模拟的。
何时: 只要希望按照顺序使用数组元素时

1.栈: 一端封闭,只能从另一端进出的数组

顺序: FILO(First in, Last out,先进后出)
何时: 如果希望始终操作最后进入数组的最新的元素时。

如何:
结尾出入栈:
入: arr.push(值);
出: var last=arr.pop();
优: 每次出入栈不影响其余元素的位置
开头出入栈:
入: arr.unshift(值);
出: var first=arr.shift();
缺: 每次出入栈都会影响每个元素的位置

2.队列: 只能从一端进入,从另一端出
顺序:FIFO(First in, First out,先进先出)
何时: 只要按照先来后到的顺序使用元素
如何: 
  从结尾入队列: arr.push(值)
  从开头出队列: var first=arr.shift()

以下是一个例子

var bus=[];
for(var i=1;i<=5;i++){
  //push
  bus.unshift("乘客"+i);
  console.log(String(bus));
}
while(bus.length>0){
  //pop
  var last=bus.shift();
  console.log(last+"下车");
  console.log(String(bus));
}

pm


二维数组:

  • 什么是: 数组中的元素,又引用了另一个子数组。
  • 何时:
    1). 存储横行竖列的二维数据
    2). 对一个大的数组中的元素,进一步分类
  • 如何创建:
//1. 先创建空数组,再添加子数组:
  var arr=[];
  arr[0]=[2,2,4,0];
  arr[1]=[0,2,2,0];
//2. 在创建数组同时,初始化子数组
  var arr=[
    [2,2,4,0],//0
    [0,2,2,0],//1
    ...
  ];
  • 访问元素: arr[r][c]:访问arr中r位置的子数组中的c位置的元素
    注意:越界: r不能越界

  • 遍历: 外层循环控制行,内层循环控制列

for(var r=0;r

String: 一串字符组成的只读字符数组

与数组的区别:
1. 可以下标访问每个字符
2. length属性标识字符个数
3. 用for循环遍历每个字符
4. 数组中不直接修改原数组的API,字符串也可用 concat,slice

内置对象: ES标准中规定的,浏览器已经实现的对象。包括11个:
String Number Boolean——包装类型
Array Math Date RegExp
Error
Function Object
Global(在浏览器中被替换为window)

包装类型:专门封装原始类型的值,并提供对原始类型的值进行操作的API 的对象。
为什么:原始类型的值,本身什么API都没有
何时: 只要试图用原始类型的值调用方法时,都会自动创建包装类型对象
如何使用: 自动创建和调用。

StringAPI: 所有StringAPI,都无权修改原字符串,必须返回新字符串

1. 大小写转换:

何时使用: 不区分大小写时
str.toUpperCase();
str.toLowerCase();

2. 获取指定位置的字符:

str.charAt(i) => str[i]
str.charCodeAt(i)
获得str中i位置的字符的unicode号
互逆操作: 将unicode号转为原字符
var char=String.fromCharCode(unicode);

3. 获取子字符串:

str.slice(starti,endi+1);
str.substring(starti,endi+1);
用法和slice完全一样。
不支持负数参数:
解决: str.length-n
str.substr(starti,n);
截取str中starti开始后的n个字符

4.检索关键词:

1).检索一个固定的关键词出现的位置:
var i=str.indexOf("关键词",fromi)
从str中fromi位置开始,找下一个"关键词"出现的位置。如果找不到了,返回-1
简写: 省略fromi,表示从0位置开始找

var str="no zuo no die no can no bibi";
       //0      7      14     21
var i=-1;
//反复查找str中每个no出现的位置
while((i=str.indexOf("no",i+1))!=-1){
  console.log("在位置"+i+"发现敏感词");
}


var i=str.lastIndexOf("关键词",fromi)
从str中fromi位置开始查找前一个"关键词"出现的位置
如果找不到,返回-1
简写: 省略fromi, 表示从末尾开始找
何时: 只要查找最后一个xxxx

你可能感兴趣的:(数组排序,"栈",二维数组,StringAPI(toUpperCase,toLowerCase,charAt,charCodeAt,slice,substring,indexOf)-07)