莫愁前路无知己,天下谁人不识君--- 唐.高适《别董大二首》
本文的数组排序,数组去重,判断出现的次数,都不使用数组的方法。
具体的流程思想在代码注释中
一、冒泡排序
//冒泡排序: 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] //console.log(resultArr);//[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 = [5,1,2,1,2,2,1,2,1,2,3,2,2,1,2,1,2,3,2,2,1,2,1,2,3,2,2,1,2,1,2,3,2,2,1,2,1,2,3,2,2,1,2,1,2,3,2,2,1,2,1,2,3,2,2,1,2,1,2,3,4,5,3,4,5,4,3,2,1]; //想知道数组arr中的1出现的次数是几次? var count = 0; for (var i = 0; i < arr.length; i++) { if(arr[i] === 1){ count++; } }*/ //希望检测的数据有五个,得到的结果的个数也是五个 var countArr = [],count; //取出每个要进行计数的数据arr[i] for (i = 0; i < resultArr.length; i++) { count = 0;//对arr[i]的计数进行初始化 //使用resultArr[i]与原数组arr中的每个元素比较计数 for(j = 0;j<arr.length;j++){ if(resultArr[i] === arr[j]){ count++; } } //将count的值保存到countArr中 countArr.push(count); } console.log(countArr);
第二种方法