數組方法的小總結
- 從數組末尾刪除一項,有哪些方法?
- ary.length--
- ary.length-=1; ary.length=ary.lengty-1;
- ary.pop()
- ary.splice(ary.length-1,1)
- 給數組末尾增加一項
- ary[ary.length]=xxx;
- ary.push()
- ary.splice(ary.length,'xxx')
- 數組的克隆
- ary.splice(0)
- slice()/ slice(0)
slice方法是通過參數start和end的傳入值來返回數組中的一段,該方法不對原數組進行操作。我們通過slice(0)可以使其返回所有項。
Array.prototype.clone=function(){ return this.slice(0); } - ary.concat();
concat方法是用來實現數組的合并的。通過和一個空函數的合并,即可實現我們的克隆功能。 Array.prototype.clone=function(){ return [].concat(this); } //或者 Array.prototype.clone=function(){ return this.concat(); } - push遍歷數組逐項添加到新數組中
Array.prototype.clone=function(){ var a=[]; for(var i=0,l=this.length;i<l;i++) a.push(this[i]); return a; }
數組去重的思路
var ary=[1,2,3,2,3,1,2,3,3,2,1];
- 雙重循環
/for(var i=0; i<ary.length; i++){
var cur=ary[i];
//跟后面每一項進行比對
for(var j=i+1; j<ary.length; j++){
if(cur==ary[j]){
//刪除數組中間項,只能用splice;
ary.splice(j,1);
j--;//防止數組塌陷
}
}
}/ - 先sort排序,然后用當前項跟相鄰項進行比較
/ary.sort(function (a,b) {
return a-b;
});
//用當前項跟他的鄰居比對,如果重復,刪掉其中一個就行;
for(var i=0; i<ary.length; i++){
if(ary[i]===ary[i+1]){
ary.splice(i,1);
i--;//防止數組塌陷
}
}/ - 遍歷數組,建立新數組,利用indexOf判斷是否存在于新數組中,不存在則push到新數組,最后返回新數組
function removeDuplicatedItem(ary) {
var ret = [];
for (var i = 0, j = ary.length; i < j; i++) {//判斷新數組中是否有某個值 indexOf
if (ret.indexOf(ary[i]) === -1) {//如果沒有
ret.push(ary[i])//把這個數放入新數組
}
}
return ret;
} - 利用不重名的特性
/* var obj={};
for(var i=0; i<ary.length; i++){
if(obj[ary[i]]){
obj[ary[i]]++; //++ +=1
}else{//走else一定是對象沒有;給這個屬性名貼個1的標簽
obj[ary[i]]=1;
}
}
//通過for..in拿到每個屬性名;
var newAry=[];
for(var attr in obj){
newAry.push(Number(attr));
}*/ - 利用對象不重名的特性,實現了重復次數的記錄,里面用到兩個循環,一個for循環,for..in循環
/var obj={};
//遍歷數組中的每一項,如果對象中沒有,把這一項賦值一份給對象, 如果對像中已經有了,說明這是重復項,我們就刪除數組中的這一項;
for(var i=0; i<ary.length; i++){
if(obj[ary[i]]){//走if說明重復了;
ary.splice(i,1);
i--;
}else{//走else說明對象中沒有這個數;那么就給obj添加屬性
obj[ary[i]]=ary[i];
}
}/
對象特性
- 不重名的特性
- 如果對象的屬性名是數字,那么打印出來的時候,按照數組的先后順序進行顯示
Math常用的方法
- Math.ceil() 向上取整
Math.ceil(2.6)
3 - Math.floor() 向下取整
- Math.random() 取0~1之間的隨機小數,不包含1;
- Math.round(Math.random()(m-n)+n); 取n~m之間的隨機整數,包含m
Math.round(Math.random()10);
3
- Math.round(Math.random()(m-n)+n); 取n~m之間的隨機整數,包含m
- Math.round() 四舍五入
- Math.pow(2,3) 冪次方
- Math.sqrt() 開平方
- Math.abs() 取絕對值
算法排序
快排
- 1、 先拿到中間的索引,通過中間索引找到他對應的項
var centerIndex=Math.floor(ary.length/2);- 這個中間項,是從數組中拎出來,即數組中沒有他了,所以,只能用splice;
- splice的返回值,是被刪除的內容以新數組的形式返回,因為我們刪除了一項,所以,要去數字必須用[0];
var centerValue=ary.splice(centerIndex,1)[0];
- 2、創建兩個新數組left,right;
var left=[],
right=[]; - 3、用ary數組跟中間項比較,比他小的放left數組,比他大的放right數組
for(var i=0; i<ary.length; i++){
var cur=ary[i];
if(cur<centerValue){
left.push(cur)
}else{
right.push(cur);
}
} - 4、 return quciksort(left).concat([center],quciksort(right));
- 函數自己調用自己,屬于"遞歸"
- 5、 停止拆分的條件 if(ary.length<=1){return ary;}
- return 1)有阻斷程序執行的功能 2)返回值;
插排
1、用splice先從ary種取出來一個數字,單獨是個數組
2、遍歷ary的數組,跟left數組,從后往前的比較,如果比left的數字小,繼續往前比,如果比某個值大,就插入到這個值的下一項的前面;(必須break,否則就會出錯) ;如果比所有的都小,那就插入到left數組的第一個;
/* function insertSort(ary) {
var left=ary.splice(0,1);
for(var i=0;i<ary.length;i++){
var cur=ary[i];
for(var j=left.length-1;j>=0;){
if(cur<left[j]){
j--;
if (j==-1){
left.unshift(cur);
}
}else{
left.splice(j+1,0,cur);
break;
}
}
}
return left;
}
var res=insertSort(ary);*/
冒泡排序
- 兩重循環,第一重循環代表的是輪數,第二重循環代表的次數,比較的次數在一次次的減少;
//外面的循環應該是比較的"輪數"
for(var i=0; i<ary.length; i++){
//里面比較的是次數
for(var j=0; j<ary.length-1-i; j++){
if(ary[j]>ary[j+1]){
//找了一個臨時的空容器
var tmp=ary[j];
ary[j]=ary[j+1];
ary[j+1]=tmp;
}
}
} - 每次比較的時候,都拿當前項跟后一項進行比較,如果比他大,交換位置;
/* var tmp=ary[j];
ary[j]=ary[j+1];
ary[j+1]=tmp;*/
跟函數相關的
-
return 阻斷函數的執行 ;
if(ary.length<=1){ return ary;//return后面的語句都不會執行; //return有阻斷程序執行的作用; }
跟循環相關的
- break 阻斷循環的執行
- continue 本次不執行,以后繼續;
- 所有能用for循環寫的,都能用while循環來寫;所有能用if..elseif...else 來寫的,都能用 switch來寫;
- for循環次數確定
- while循環,次數不確定