當前位置:首頁 » 網頁前端 » 前端遍歷演算法快速
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

前端遍歷演算法快速

發布時間: 2022-09-26 21:38:48

⑴ js 遍歷["1","2","3"]

1.遍歷方式:
var arr = ["1","2","3"];
var str = "";

for(var i=0;i<arr.length;i++){
if(i<arr.length-1){
str += arr[i] + ",";
}else{
str += arr[i];
}
}
console.log(str);
2.一般你這個例子都是用var str = arr.join(",")直接轉換

前端演算法入門一:刷演算法題常用的JS基礎掃盲

此篇屬於前端演算法入門系列的第一篇,主要介紹常用的 數組方法 、 字元串方法 、 遍歷方法 、 高階函數 、 正則表達式 以及相關 數學知識 。

在尾部追加,類似於壓棧,原數組會變。

在尾部彈出,類似於出棧,原數組會變。數組的 push & pop 可以模擬常見數據結構之一:棧。

在頭部壓入數據,類似於入隊,原數組會變。

在頭部彈出數據,原數組會變。數組的 push(入隊) & shift(出隊) 可以模擬常見數據結構之一:隊列。

concat會在當前數組尾部拼接傳入的數組,然後返回一個新數組,原數組不變。

在數組中尋找該值,找到則返回其下標,找不到則返回-1。

在數組中尋找該值,找到則返回true,找不到則返回false。

將數組轉化成字元串,並返回該字元串,不傳值則默認逗號隔開,原數組不變。

翻轉原數組,並返回已完成翻轉的數組,原數組改變。

從start 開始截取到end,但是不包括end

可參考 MDN:Sort

將數組轉化成字元串,並返回該字元串,逗號隔開,原數組不變。

返回指定索引位置處的字元。類似於數組用中括弧獲取相應下標位置的數據。

類似數組的concat(),用來返回一個合並拼接兩個或兩個以上字元串。原字元串不變。

indexOf,返回一個字元在字元串中首次出現的位置,lastIndexOf返回一個字元在字元串中最後一次出現的位置。

提取字元串的片斷,並把提取的字元串作為新的字元串返回出來。原字元串不變。

使用指定的分隔符將一個字元串拆分為多個子字元串數組並返回,原字元串不變。

match()方法可在字元串內檢索指定的值,或找到一個或多個正則表達式的匹配,並返回一個包含該搜索結果的數組。

注意事項 :如果match方法沒有找到匹配,將返回null。如果找到匹配,則 match方法會把匹配到以數組形式返回,如果正則規則未設置全局修飾符g,則 match方法返回的數組有兩個特性:input和index。input屬性包含整個被搜索的字元串。index屬性包含了在整個被搜索字元串中匹配的子字元串的位置。

replace接收兩個參數,參數一是需要替換掉的字元或者一個正則的匹配規則,參數二,需要替換進去的字元,仔實際的原理當中,參數二,你可以換成一個回調函數。

在目標字元串中搜索與正則規則相匹配的字元,搜索到,則返回第一個匹配項在目標字元串當中的位置,沒有搜索到則返回一個-1。

toLowerCase把字母轉換成小寫,toUpperCase()則是把字母轉換成大寫。

includes、startsWith、endsWith,es6的新增方法,includes 用來檢測目標字元串對象是否包含某個字元,返回一個布爾值,startsWith用來檢測當前字元是否是目標字元串的起始部分,相對的endwith是用來檢測是否是目標字元串的結尾部分。

返回一個新的字元串對象,新字元串等於重復了指定次數的原始字元串。接收一個參數,就是指定重復的次數。原字元串不變。

最常用的for循環,經常用的數組遍歷,也可以遍歷字元串。

while、do while主要的功能是,當滿足while後邊所跟的條件時,來執行相關業務。這兩個的區別是,while會先判斷是否滿足條件,然後再去執行花括弧裡面的任務,而do while則是先執行一次花括弧中的任務,再去執行while條件,判斷下次還是否再去執行do裡面的操作。也就是說 do while至少會執行一次操作 .

拷貝一份遍歷原數組。

for…of是ES6新增的方法,但是for…of不能去遍歷普通的對象, for…of的好處是可以使用break跳出循環。

面試官:說一下 for...in 和 for...of 區別?

返回一個布爾值 。當我們需要判定數組中的元素是否滿足某些條件時,可以使用every / some。這兩個的區別是,every會去判斷判斷數組中的每一項,而 some則是當某一項滿足條件時返回。

rece 從左到右將數組元素做「疊加」處理,返回一個值。receRight 從右到左。

Object.keys方法的參數是一個對象,返回一個數組。該數組的成員都是該對象自身的(而不是繼承的)所有屬性名,且只返回可枚舉的屬性。

Object.getOwnPropertyNames方法與Object.keys類似,也是接受一個對象作為參數,返回一個數組,包含了該對象自身的所有屬性名。但它能返回不可枚舉的屬性。

這里羅列一些我在刷演算法題中遇到的正則表達式,如果有時間可認真學一下正則表達式不要背。

持續更新,敬請期待……

若一個正整數無法被除了1 和它自身之外的任何自然數整除,則稱該數為質數(或素數),否則稱該正整數為合數。

持續更新,敬請期待……


作者:擺草猿
鏈接:https://juejin.cn/post/7087134135193436197

⑶ 2.簡單了解js中的幾種遍歷

方法:for, forEach,map,filter,every,some,in等

1. for循環,需要知道數組的長度,才能遍歷,

2. forEach循環,循環數組中每一個元素並採取操作, 沒有返回值, 可以不用知道數組長度

⑷ JS多維數組如何快速遍歷查詢

<script type="text/javascript">
//比如
var values=new Array();
values[0]="北京";
values[1]="天津";
....//其他省略
//遍歷1
for(var i=0;i<values.length;i ){
alert(values[i]);
}
//遍歷2
for(var ele in values){
alert(values[ele]);//下標
}
</script>

⑸ C語言編寫程序實現圖的遍歷操作

樓主你好,下面是源程序!

/*/////////////////////////////////////////////////////////////*/
/* 圖的深度優先遍歷 */
/*/////////////////////////////////////////////////////////////*/
#include <stdlib.h>
#include <stdio.h>
struct node /* 圖頂點結構定義 */
{
int vertex; /* 頂點數據信息 */
struct node *nextnode; /* 指下一頂點的指標 */
};
typedef struct node *graph; /* 圖形的結構新型態 */
struct node head[9]; /* 圖形頂點數組 */
int visited[9]; /* 遍歷標記數組 */

/********************根據已有的信息建立鄰接表********************/
void creategraph(int node[20][2],int num)/*num指的是圖的邊數*/
{
graph newnode; /*指向新節點的指針定義*/
graph ptr;
int from; /* 邊的起點 */
int to; /* 邊的終點 */
int i;
for ( i = 0; i < num; i++ ) /* 讀取邊線信息,插入鄰接表*/
{
from = node[i][0]; /* 邊線的起點 */
to = node[i][1]; /* 邊線的終點 */

/* 建立新頂點 */
newnode = ( graph ) malloc(sizeof(struct node));
newnode->vertex = to; /* 建立頂點內容 */
newnode->nextnode = NULL; /* 設定指標初值 */
ptr = &(head[from]); /* 頂點位置 */
while ( ptr->nextnode != NULL ) /* 遍歷至鏈表尾 */
ptr = ptr->nextnode; /* 下一個頂點 */
ptr->nextnode = newnode; /* 插入節點 */
}
}

/********************** 圖的深度優先搜尋法********************/
void dfs(int current)
{
graph ptr;
visited[current] = 1; /* 記錄已遍歷過 */
printf("vertex[%d]\n",current); /* 輸出遍歷頂點值 */
ptr = head[current].nextnode; /* 頂點位置 */
while ( ptr != NULL ) /* 遍歷至鏈表尾 */
{
if ( visited[ptr->vertex] == 0 ) /* 如過沒遍歷過 */
dfs(ptr->vertex); /* 遞回遍歷呼叫 */
ptr = ptr->nextnode; /* 下一個頂點 */
}
}

/****************************** 主程序******************************/
void main()
{
graph ptr;
int node[20][2] = { {1, 2}, {2, 1}, /* 邊線數組 */
{1, 3}, {3, 1},
{1, 4}, {4, 1},
{2, 5}, {5, 2},
{2, 6}, {6, 2},
{3, 7}, {7, 3},
{4, 7}, {4, 4},
{5, 8}, {8, 5},
{6, 7}, {7, 6},
{7, 8}, {8, 7} };
int i;
clrscr();
for ( i = 1; i <= 8; i++ ) /* 頂點數組初始化 */
{
head[i].vertex = i; /* 設定頂點值 */
head[i].nextnode = NULL; /* 指針為空 */
visited[i] = 0; /* 設定遍歷初始標志 */
}
creategraph(node,20); /* 建立鄰接表 */
printf("Content of the gragh's ADlist is:\n");
for ( i = 1; i <= 8; i++ )
{
printf("vertex%d ->",head[i].vertex); /* 頂點值 */
ptr = head[i].nextnode; /* 頂點位置 */
while ( ptr != NULL ) /* 遍歷至鏈表尾 */
{
printf(" %d ",ptr->vertex); /* 印出頂點內容 */
ptr = ptr->nextnode; /* 下一個頂點 */
}
printf("\n"); /* 換行 */
}
printf("\nThe end of the dfs are:\n");
dfs(1); /* 列印輸出遍歷過程 */
printf("\n"); /* 換行 */
puts(" Press any key to quit...");
getch();
}


/*//////////////////////////////////////////*/
/* 圖形的廣度優先搜尋法 */
/* ///////////////////////////////////////*/
#include <stdlib.h>
#include <stdio.h>
#define MAXQUEUE 10 /* 隊列的最大容量 */
struct node /* 圖的頂點結構定義 */
{
int vertex;
struct node *nextnode;
};
typedef struct node *graph; /* 圖的結構指針 */
struct node head[9]; /* 圖的頂點數組 */
int visited[9]; /* 遍歷標記數組 */
int queue[MAXQUEUE]; /* 定義序列數組 */
int front = -1; /* 序列前端 */
int rear = -1; /* 序列後端 */

/***********************二維數組向鄰接表的轉化****************************/
void creategraph(int node[20][2],int num)
{
graph newnode; /* 頂點指針 */
graph ptr;
int from; /* 邊起點 */
int to; /* 邊終點 */
int i;
for ( i = 0; i < num; i++ ) /* 第i條邊的信息處理 */
{
from = node[i][0]; /* 邊的起點 */
to = node[i][1]; /* 邊的終點 */
/* 建立新頂點 */
newnode = ( graph ) malloc(sizeof(struct node));
newnode->vertex = to; /* 頂點內容 */
newnode->nextnode = NULL; /* 設定指針初值 */
ptr = &(head[from]); /* 頂點位置 */
while ( ptr->nextnode != NULL ) /* 遍歷至鏈表尾 */
ptr = ptr->nextnode; /* 下一個頂點 */
ptr->nextnode = newnode; /* 插入第i個節點的鏈表尾部 */
}
}

/************************ 數值入隊列************************************/
int enqueue(int value)
{
if ( rear >= MAXQUEUE ) /* 檢查佇列是否全滿 */
return -1; /* 無法存入 */
rear++; /* 後端指標往前移 */
queue[rear] = value; /* 存入佇列 */
}

/************************* 數值出隊列*********************************/
int dequeue()
{
if ( front == rear ) /* 隊列是否為空 */
return -1; /* 為空,無法取出 */
front++; /* 前端指標往前移 */
return queue[front]; /* 從隊列中取出信息 */
}

/*********************** 圖形的廣度優先遍歷************************/
void bfs(int current)
{
graph ptr;
/* 處理第一個頂點 */
enqueue(current); /* 將頂點存入隊列 */
visited[current] = 1; /* 已遍歷過記錄標志置疑1*/
printf(" Vertex[%d]\n",current); /* 列印輸出遍歷頂點值 */
while ( front != rear ) /* 隊列是否為空 */
{
current = dequeue(); /* 將頂點從隊列列取出 */
ptr = head[current].nextnode; /* 頂點位置 */
while ( ptr != NULL ) /* 遍歷至鏈表尾 */
{
if ( visited[ptr->vertex] == 0 ) /*頂點沒有遍歷過*/
{
enqueue(ptr->vertex); /* 獎定點放入隊列 */
visited[ptr->vertex] = 1; /* 置遍歷標記為1 */
printf(" Vertex[%d]\n",ptr->vertex);/* 印出遍歷頂點值 */
}
ptr = ptr->nextnode; /* 下一個頂點 */
}
}
}

/*********************** 主程序 ************************************/
/*********************************************************************/
void main()
{
graph ptr;
int node[20][2] = { {1, 2}, {2, 1}, /* 邊信息數組 */
{6, 3}, {3, 6},
{2, 4}, {4, 2},
{1, 5}, {5, 1},
{3, 7}, {7, 3},
{1, 7}, {7, 1},
{4, 8}, {8, 4},
{5, 8}, {8, 5},
{2, 8}, {8, 2},
{7, 8}, {8, 7} };
int i;
clrscr();
puts("This is an example of Width Preferred Traverse of Gragh.\n");
for ( i = 1; i <= 8; i++ ) /*頂點結構數組初始化*/
{
head[i].vertex = i;
head[i].nextnode = NULL;
visited[i] = 0;
}
creategraph(node,20); /* 圖信息轉換,鄰接表的建立 */
printf("The content of the graph's allist is:\n");
for ( i = 1; i <= 8; i++ )
{
printf(" vertex%d =>",head[i].vertex); /* 頂點值 */
ptr = head[i].nextnode; /* 頂點位置 */
while ( ptr != NULL ) /* 遍歷至鏈表尾 */
{
printf(" %d ",ptr->vertex); /* 列印輸出頂點內容 */
ptr = ptr->nextnode; /* 下一個頂點 */
}
printf("\n"); /* 換行 */
}
printf("The contents of BFS are:\n");
bfs(1); /* 列印輸出遍歷過程 */
printf("\n"); /* 換行 */
puts(" Press any key to quit...");
getch();
}


⑹ 前端 遍歷數組對象然後拼接成一句話,包括逗號和空格

直接上代碼:

functionarr2Str(arr,connectStr){

varstr="";

connectStr=connectStr===void0?"":connectStr;

//遍歷數組

arr.forEach(ele=>{

//取出對應的值

for(varkeyinele){

//字元串拼接

str+=ele[key]+connectStr;

}

})

str=str.substr(0,str.length-1);

console.log(str);

returnstr;

}

//使用方法:

vartestArr=[{Name:"Talk2",Mole:"Intel",Who:"WLAN",Action:"can't",English:"beconnect"}];

arr2Str(testArr,"");//傳入需要拼接的數組和拼接符

運行效果如圖:

⑺ js數組遍歷的常用的幾種方法以及差異和性能優化

<script type="text/javascript">
/*對比:
1、map速度比foreach快
2、map會返回一個新數組,不對原數組產生影響,foreach不會產生新數組,foreach返回undefined
3、map因為返回數組所以可以鏈式操作,foreach不能
4, map里可以用return ,而foreach里用return不起作用,foreach不能用break,會直接報錯*/
/*方法一:*/
var arr1 = [1, 2, 3, 4, 5, 6];
for(var i = 0, len = arr1.length; i < len; i++) { //優化性能處理
console.log(arr1[i], 'for遍歷出來的數據'); //每個item 1,2,3,4,5,6
}
/*方法二:*/
/*forEach方法中的function回調支持3個參數,第1個是遍歷的數組內容;第2個是對應的數組索引,第3個是數組本身*/
var arr2 = [{
name: 'bob',
age: 20
},
{
name: 'tom',
age: 18
},
{
name: 'sos',
age: 19
}
]
arr2.forEach((val, i) => { //沒有返回值的,對原來數組也沒有影響
console.log(val, '遍歷出來的每個obj')
});
/*方法三:*/
var fruits = [1, 2, 3, 4, 5, 6, 7, 8];
let arr = fruits.map((item, index) => {
console.log(item, 'top')
console.log(index, 'top')
return item * 8
})
console.log(arr, 'newarr') //[8, 16, 24, 32, 40, 48, 56, 64] "newarr"
var a = fruits.indexOf("Apple", 4);
console.log(a)
//for 和 forEach都是普通循環,map 帶返回值並且返回一個新數組;
/*
*當前元素的值,當期元素的索引值,當期元素屬於的數組對象;
語法:array.map(function(currentValue,index,arr), thisValue)
map() 方法返回一個新數組,數組中的元素為原始數組元素調用函數處理後的值。
map() 方法按照原始數組元素順序依次處理元素。
注意: map() 不會對空數組進行檢測。
注意: map() 不會改變原始數組。
* */
/*方法四:*/
/*兼容寫法:
不管是forEach還是map在IE6 - 8 下都不兼容( 不兼容的情況下在Array.prototype上沒有這兩個方法), 那麼需要我們自己封裝一個都兼容的方法:*/
/**
* forEach遍歷數組
* @param callback [function] 回調函數;
* @param context [object] 上下文;
*/
Array.prototype.myForEach = function myForEach(callback, context) {
context = context || window;
if('forEach' in Array.prototye) {
this.forEach(callback, context);
return;
}
//IE6-8下自己編寫回調函數執行的邏輯
for(var i = 0, len = this.length; i < len; i++) {
callback && callback.call(context, this[i], i, this);
}
}
/**
* map遍歷數組
* @param callback [function] 回調函數;
* @param context [object] 上下文;
*/
Array.prototype.myMap = function myMap(callback, context) {
context = context || window;
if('map' in Array.prototye) {
return this.map(callback, context);
}
//IE6-8下自己編寫回調函數執行的邏輯var newAry = [];
for(var i = 0, len = this.length; i < len; i++) {
if(typeof callback === 'function') {
var val = callback.call(context, this[i], i, this);
newAry[newAry.length] = val;
}
}
return newAry;
}
</script>

⑻ 前端——遍歷函數理解

1.for循環

注意事項:for更多用於知道數組的長度的情況下

    ```

var obj = [1, 2, 3,4 ];

for(var a=0; a<obj.length;a++) //for循環三個參數 : 1.起始條件 2.終止條件 3.循環條件 。 可省略

{

console.log(obj[a])

}

    ```

2.forEach循環

注意事項:遍歷整個數組中所有的元素,沒有返回值

var obj =[1,'盼希',true,'ponX'];

          obj.forEach((item,index)=>{

            item='forEach用法,'+item;

            console.log(item);

        })

3.map函數·

注意事項:遍歷數組中的每個元素,並且回調,需要返回值,返回的值組成一個新的數組,原來的數組沒有發生變化

var obj =[1,'盼希',true,'ponX'];

          var obj2=obj.map(function( item,index) {

            item="map遍歷"+item;

            console.log(item)

            return item;

        })

        console.log("obj2", obj);

4.filter函數

注意事項:過濾符合條件的元素,並且組成一個新的數組 原數組不變

var obj =['1',2,'盼希',4,'HelloWorld',false];

          var obj2=arr.filter(function(item,index) {

            return typeof item==='number';

          })

          console.log(obj,obj2);

5.some函數

注意事項:遍歷數組中是否有符合條件的元素,返回的是boolean值

var obj =['2',5,'盼希',true,'HelloWorld',1];

          var obj2=obj.some(function(item,index) {

            return typeof item==='number';

          })

          console.log(obj,obj2);

6.every函數

注意事項:遍歷數組中是否有符合條件的元素,並且返回的是boolean值

var obj =['2',4,'盼希',true,'HelloWorld'];

          var obj2=obj.every(function(item,index) {

            return typeof item==='number';

          })

          console.log(obj,obj2);

7遍歷對象的方法: for..in

let obj ={c:'2',d:4,e:true};

        for (var h in obj) {

            console.log(obj[h],h)

        }

        console.log(obj);

⑼ web前端不是數組怎麼樣去遍歷

看情況而定 如果是偽數組可以進行轉換成真的數組在進行 for()循環遍歷
如果是對象可以通過for in 方式遍歷 取到鍵和值

⑽ Web前端工程師你知道JavaScript中常用的排序演算法嗎

今天小編要跟大家分享的文章是關於JavaScript中常用的排序演算法。相信很多剛剛從事Web前端工作或者准備面試的小夥伴們對此還不是很了解,下面就讓小編來為大家介紹一下吧!


一、冒泡排序


冒泡排序是我們在編程演算法中,算是比較常用的排序演算法之一,在學習階段,也是最需要接觸理解的演算法,所以我們放在第一個來學習。


演算法介紹:


·___冉舷嗔詰牧礁鱸,如果前一個比後一個大,則交換位置。


·___諞宦職炎畲蟮腦胤諾攪俗詈竺妗


·___捎諉看聞判蜃詈笠桓齠際親畲蟮模災蟀湊詹街1排序最後一個元素不用比較。

冒泡演算法改進:


設置一個標志,如果這一趟發生了交換,則為true。否則為false。如果這一趟沒有發生交換,則說明排序已經完成。代碼如下:

假如數組長度是20,如果只有前十位是無序排列的,後十位是有序且都大於前十位,所以第一趟遍歷排序的時候發生交換的位置必定小於10,且該位置之後的必定有序,我們只需要排序好該位置之前的就可以,因此我們要來標記這個位置就可以了,即可以記錄每次掃描中最後一次交換的位置,下次掃描的時候只要掃描到上次的最後交換位置就行了,因為後面的都是已經排好序的,無需再比較,代碼如下:

每一次循環從兩頭出發算出最大和最小值,代碼如下:

在代碼3的基礎上記錄每次掃描最後一次交換的位置,下次掃描的時候只要掃描到上次的最後交換位置就行,同代碼2,代碼如下:

二、快速排序


演算法介紹:


快速排序是對冒泡排序的一種改進,第一趟排序時將數據分成兩部分,一部分比另一部分的所有數據都要小。然後遞歸調用,在兩邊都實行快速排序。

三、選擇排序


演算法介紹:


選擇排序就是從一個未知數據空間里,選取之最放到一個新的空間

四、插入排序


演算法介紹:


·___擁諞桓瞿媳慌藕眯虻腦乜


·___〕魷亂桓鱸兀諞丫判虻腦匭蛄兄寫雍笙蚯吧_


·___綣雅判虻腦卮笥諶〕齙腦兀蚪浞直鶼蚝笠貧晃


·___鋇秸業揭雅判虻腦刂行∮諢虻扔諶〕齙腦兀〕齙腦胤諾剿暮笠晃


·___馗床街2

插入排序演算法改進-二分法插入排序:

以上就是小編今天為大家分享的JavaScript中常用的排序演算法的文章,文章中介紹的是四種比較基礎的排序方法,JavaScript的排序演算法還有很多,這是我們4種最常見也是最基本的演算法,掌握理解好,在面試和開發中也能從容應對了。想要了解更多Web前端知識記得關注北大青鳥Web培訓官網哦。最後祝願小夥伴們工作順利!


本文轉自前端研究所。


*聲明:內容與圖片均來源於網路(部分內容有修改),版權歸原作者所有,如來源信息有誤或侵犯權益,請聯系我們刪除或授權事宜。