莫愁前路无知己,天下谁人不识君--- 唐.高适《别董大二首》
本文的数组排序,数组去重,判断出现的次数,都不使用数组的方法。
具体的流程思想在代码注释中
一、冒泡排序
//冒泡排序: var arr = [1,2,3,5,4]; var j,temp,flag; var count = 0;//用于记录比较的轮数 //外层循环控制比较的趟数 //使用假设成立法:(使用变量标记的方式) //1 找到程序中不确定的操作,设置假设条件 //2 对假设条件进行验证(设置一个可以使假设失败的条件) //3 对假设条件的最终值进行检测,设置操作 for(var i = 0;i < arr.length - 1; i++){ count++; flag = true;//假设本轮执行排序后可以跳出 for(j = 0; j < arr.length - 1 - i; j++){ if(arr[j] > arr[j+1]){ temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; //只要进入到if中,说明排序可能没有完毕,设置假设条件为false //阻止跳出 flag = false; } } if(flag){ break; } } console.log(arr,count);
一、数组去重
//数组去重: var arr = [5,1,2,1,2,2,1,2,1,2,3,4,3,4,5,3,4,5,4,3,2,1]; //希望得到的结果为[1,2,3,4,5] //1 创建一个结果数组 var resultArr = [arr[0]]; var flag; //2 遍历数组 for(var i = 1; i < arr.length; i++){ // 正确的实现方式 flag = true;//假设当前arr[i]可以放入到resultArr中 for(j = 0; j < resultArr.length; j++){ //设置可以让假设失败的条件:如果偶遇任何一个元素相等,即说明不能放入 if(arr[i] === resultArr[j]){ flag = false; } } //根据flag的值设置最终操作 if(flag){ resultArr.push(arr[i]); } } console.log(resultArr);
简单介绍一下Set:Set
是ES6中新的对象,数组去重特别方便。只需要两行代码
//先定义一个重复的数组
var arr = [1,1,2,2,2,3,3,4,4] var set = new Set(arr) // {1,2,3,4} var newArr = Array.from(set) // 再将set转变成array console.log(newArr) // [1,2,3,4]
实现的原理:Set
于Array
的区别在于:Array
中允许出现重复的元素,例如[1,2,2,3]
;而Set
中的所有元素都是唯一的,只能是{1,2,3}
。利用这一特性,我们就可以迅速地去掉数组中重复的元素。
三、出现的次数
补充:第一种方法略麻烦,数组去重后,然后比较出现的次数,略麻烦已删除,推荐第二种
第二种方法 (推荐第二种方法)
// 先定义一个数组
var arr=["a","a","a","a","b","b","b","c","c","c"]
//再定义一个对象,用来保存相同的数据 var obj={} for(var i=0;i<arr.length;i++){ //将循环数组中的每个数赋值给item 作为对象中的键 var item=arr[i] if(obj[item]){//这句的意思是对象中以item作为键存在吗,如果存在的话,就让这键的值再加1 obj[item]=obj[item]+1 }else{ //如果不存在等于1,多次循环就可得到结果 obj[item]=1 } } console.log(obj)//结果:{a: 4, b: 3, c: 3}