JavaScript内置对象Array的扩展(去重,排序,合并)
2017-05-25 16:07
555 查看
JS的一大灵活之处就在于可以对内置对象进行扩展,添加属于自己的方法,本文将使用常见的算法对Array进行若干扩展!
2.2,循环遍历数组,同时建立一个json对象,记录是否重复,高效!
![](https://img-blog.csdn.net/20170525121245782?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR1lfVV9ZRw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](https://img-blog.csdn.net/20170525135528109?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR1lfVV9ZRw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
从上图中可以看出,冒泡排序的循环是分两层的,即一个外层一个内层,外层循环每次排好一个就是把当前最大的数字‘沉’到最下面,每排好一个数,都要进行内部的一次循环,挨个比较。每次外循环都会排好一个数字,第0次把最大的数排到最后,第1次把次大的数字排好……所以内循环的时候,对于前面已经排好的i个数字就不要继续再排了也就是下面的 j < len - 1 - i;
其实对于上面的排序仍然是不太好的冒泡,如果遇到很坏的情况,上面的排序倒是不错,但如果遇到很好的情况,比如数组本来就是排好序的,那就没必要再折腾下去了,设计一个标志位
下面附一个递归的二分查找,用于学习
1,去重复
1.1,使用Array本身就有的indexOf方法:Array.prototype.uniqeu = Array.prototype.uniqeu || function() { var aRet = []; for (var i = 0, len = this.length; i < len; i++) { if (aRet.indexOf(this[i]) === -1) { aRet.push(this[i]); } } return aRet; };
2.2,循环遍历数组,同时建立一个json对象,记录是否重复,高效!
Array.prototype.uniqeu = Array.prototype.uniqeu || function() { var aRet = []; var json = {}; for (var i = 0, len = this.length; i < len; i++) { if (!json[this[i]]) { aRet.push(this[i]); json[this[i]] = true; } } console.log(json); return aRet; }
2,排序
2.1,冒泡排序从上图中可以看出,冒泡排序的循环是分两层的,即一个外层一个内层,外层循环每次排好一个就是把当前最大的数字‘沉’到最下面,每排好一个数,都要进行内部的一次循环,挨个比较。每次外循环都会排好一个数字,第0次把最大的数排到最后,第1次把次大的数字排好……所以内循环的时候,对于前面已经排好的i个数字就不要继续再排了也就是下面的 j < len - 1 - i;
Array.prototype.bubbleSort = Array.prototype.bubbleSort || function() { for (var i = 0, len = this.length; i < len - 1; i++) { for (var j = 0; j < len - i - 1; j++) { if (this[j] > this[j+1]) { var t = this[j]; this[j] = this[j+1]; this[j+1] = t; } } } return this; }
其实对于上面的排序仍然是不太好的冒泡,如果遇到很坏的情况,上面的排序倒是不错,但如果遇到很好的情况,比如数组本来就是排好序的,那就没必要再折腾下去了,设计一个标志位
Array.prototype.bubbleSort = Array.prototype.bubbleSort || function() { var bSorted = true; for (var i = 0, len = this.length; i < len - 1 && bSorted; i++) { bSorted = false; for (var j = 0; j < len - 1 - i; j++) { if (this[j] > this[j+1]) { var t = this[j]; this[j] = this[j+1]; this[j+1] = t; bSorted = true;//如果已经排好序了就不存在this[j]>this[j+1]了 } } } return this; }
2.2,二分查找(折半查找)
用于已经排好序的数组Array.prototype.binarySearch = Array.prototype.binarySearch || function(aim) { var low = 0; var high = this.length - 1; while(low <= high) { var mid = Math.ceil((low + high) / 2); if (aim > this[mid]) { low = mid + 1; } else if (aim < this[mid]) { high = mid - 1; } else { return mid; } } return -1; }
下面附一个递归的二分查找,用于学习
function binarySearch(arr, low, high, target) { var mid = Math.ceil((low + high)/2); if (low <= high && low >= 0 && high < arr.length) { if (target > arr[mid]) { return binarySearch(arr, mid+1, high, target) } else if (target < arr[mid]) { return binarySearch(arr, low, mid-1, target); } else { return mid; } } else { return -1; } }
合并去重
var arr1 = [1,2,3,4,5]; var arr2 = [3,2,6,7,9]; //合并两个数组 Array.prototype.myConcat = Array.prototype.myConcat || function(arr) { for (var i = 0; i < arr.length; i++) { this.indexOf(arr[i]) === -1 ? this.push(arr[i]) : {}; } return this; } alert(arr1.myConcat(arr2));//1,2,3,4,5,6,7,9
相关文章推荐
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
- javascript 利用Array的sort方法,对Array进行排序 (Array里面放的是对象而不是字符串)
- JavaScript Array对象扩展indexOf()方法
- 扩展javascript内置对象
- JavaScript内置对象--Array
- javascript内置对象数组Array和字符串string的一些方法
- 【Array类型】JavaScript中的原生对象以及Microsoft AJAX Library中的相关扩展
- JavaScript 内置对象(一):Array 对象(构造函数、属性和方法)
- 为JavaScript内置对象扩展方法
- javascript内置对象Array
- JavaScript基础(DOM)-Document对象、Element 对象、Attribute 对象 -JavaScript的内置对象(Array 对象、Date 对象、String 对象)
- JavaScript扩展内置对象对for in的影响
- JavaScript Array 对象扩展方法
- JavaScript基础----29JS内置对象-Array数组对象
- JavaScript内置对象——Array方法
- javascript Array数组对象的扩展函数代码
- 收集JavaScript内置对象扩展原型函数1
- Javascript进阶篇——( JavaScript内置对象---下)--Array数组对象---笔记整理
- JavaScript 内置对象(一):Array 对象(构造函数、属性和方法)
- javascript 内置对象 - 数组的排序