JS里各种循环总结

这篇文章起源于一道面试题,找出一个字符串中,出现次数最多的字符。面试题不难,正常思路是遍历字符串,统计下字符个数,再排个序,找出最大的。 可是可是,好久没手写代码的我,写不来for循环了,平时太依赖自动提示了,依赖调试工具了,都是写错了,然后看报错信息然后改就行。所以所以有了这篇文章。

普通for循环

普通for循环可 遍历** 数组** 字符串

//遍历数组
let array = [1,2,3];
for(let i =0; i<array.length; i++){
   const value = array[i];
   console.log(value);
}
//遍历字符串
let str = "hello zack!";
for(let i =0; i<str.length; i++){
   const value = str[i];
   console.log(value);
}

for...in遍历

for...in可用于遍历字符串对象数组

//遍历数组
let array = [1,2,3];
for(let i in array){
   const value = array[i];
   console.log(value);
}
//遍历字符串
let str = "hello zack!";
for(let i in str){
   const value = str[i];
   console.log(value);
}
//遍历对象
let obj={name:"zack",age:24};
for(let i in obj){
   const value = obj[i];
   console.log(value);
}

forEach 遍历

forEach在ES6之前是数组特有的方法,只能用于遍历数组。ES6之后,新增了Set和Map数据解构,也带有forEach方法。

//遍历数组
let array = [1,2,3,4];
array.forEach(function(value){
   console.log(value);
})
//遍历Set
let array = [1,2,3,4];
let set = new Set(array);
set.forEach(function(value){
   console.log(value);
})
//遍历Map
let map= new Map([["a",{}],["b","sss"],["c",222]]);
map.forEach(function(value,key){
   console.log(key+"=="+value);
})

for...of ES6新增

for...of 用于遍历部署了迭代器接口Symbol.iterator的数据解构。 ES6以后部署了迭代器接口的数据解构有,数组,字符串,Set,Map。对象是没有这个接口的,也就是说for...of不能用于遍历对象。

//遍历字符串
let str ="string";
for(let v of str){
   console.log(v);
}
//遍历数组
let array = [1,2,3,4];
for(let v of array){
   console.log(v);
}
//遍历Set
let array = [1,2,3,4];
let set = new Set(array);
for(let v of set ){
   console.log(v);
}
//遍历Map
let map= new Map([["a",{}],["b","sss"],["c",222]]);
for(let v of map){
   console.log(v[0]+":"+v[1]);
}
//利用解构直接获取key,value
for(let [key,value] of map){
   console.log(key+":"+value);
}
for(let v of map.keys()){
   console.log(v);
}
for(let v of map.values()){
   console.log(v);
}

通过一些操作也是可以遍历对象的,可以选择手动给对象添加一个迭代器接口,或者是把对象转换为其它数据结构。

//通过Object.valuse 获取对象的所有值。
let obj={name:"zack",age:24};
for(let v of Object.values(obj)){
   console.log(v);
}

最后给出开始那道面试题的参考。

function findMax(str){
   //统计字符
   let count = {};
   for(let char of str){
       if(count[char] == null){
           count[char]=1;
       }else{
           count[char]++;
       }
   }
   //排序
   let res = Object.entries(count).sort((a,b)=>{
       return b[1]-a[1];
   })
   
   return res[0];
}
使用 Discussions 讨论 Github 上编辑