JS去除数组重复值的五种不同⽅法今天⼯作遇到此问题,尝试多个⽅法不尽⼈意,故此写个博客来总结⼀下如何在js中去除重复元素。Array类型并没有提供去重复的⽅法,如果要把数组的重复元素⼲掉,那得⾃⼰想办法:
⽅法1:
hod1 = function(){
var arr[];  //定义⼀个临时数组
for(var i = 0; i < this.length; i++){  //循环遍历当前数组
//判断当前数组下标为i的元素是否已经保存到临时数组
//如果已保存,则跳过,否则将此元素保存到临时数组中
if(arr1.indexOf(this[i]) == -1){
arr.push(this[i]);
}
}
return arr;
}
⽅法2:
hod2 = function(){
var h{};  //定义⼀个hash表
var arr[]; //定义⼀个临时数组
for(var i = 0; i < this.length; i++){  //循环遍历当前数组
//对元素进⾏判断,看是否已经存在表中,如果存在则跳过,否则存⼊临时数组
if(!h[this[i]]){
//存⼊hash表
h[this[i]] = true;
//把当前数组元素存⼊到临时数组中
arr.push(this[i]);
}
}
return arr;
}
⽅法3:
hod3 = function(){
//直接定义结果数组
var arr[this[0]];
for(var i = 1; i < this.length; i++){  //从数组第⼆项开始循环遍历此数组
//对元素进⾏判断:
//如果数组当前元素在此数组中第⼀次出现的位置不是i
//那么我们可以判断第i项元素是重复的,否则直接存⼊结果数组
if(this.indexOf(this[i]) == i){
arr.push(this[i]);
}
}
return arr;
}
⽅法4:
hod4 = function(){
//将数组进⾏排序
this.sort();
//定义结果数组
var arr[this[0]];
for(var i = 1; i < this.length; i++){  //从数组第⼆项开始循环遍历数组
//判断相邻两个元素是否相等,如果相等说明数据重复,否则将元素写⼊结果数组
if(this[i] !== arr[arr.length - 1]){
arr.push(this[i]);
}
}
return arr;
}
例如:
var arr = [112,112,34,'你好',112,112,34,'你好','str','str1'];
hod3());
⽅法1和⽅法3都⽤到了数组的indexOf()⽅法,此⽅法主要⽤来查元素在数组中第⼀次出现的位置。⽐较浪费资源和时间。⽅法2使⽤的是hash表,把已经出现过的元素通过下标形式写⼊到⼀个object内,下标的引⽤要⽐⽤数组indexOf()⽅法搜索节省时间。
⽅法4是先将数组排序,然后⼀次⽐较相邻的两个元素的值,排序使⽤的是js原⽣的sort()⽅法。
读者可以⾃⾏编写程序测试四种⽅法的效率如何。例如:⾸先利⽤随机函数⽣成⼀个50000长度的随机数数组,然后分别⽤四种⽅法进⾏执⾏,记录程序运⾏时间进⾏⽐较四种⽅法的优劣。
⽅法五、个⼈⽐较喜欢的⼀个函数
function unique(arr) {
var result = [], isRepeated;
for (var i = 0, len = arr.length; i < len; i++) {
isRepeated = false;
for (var j = 0, len = result.length; j < len; j++) {
if (arr[i] == result[j]) {
isRepeated = true;
break;
}
}
if (!isRepeated) {
result.push(arr[i]);
}
}
return result;
}
总体思路是把数组元素逐个搬运到另⼀个数组,搬运的过程中检查这个元素是否有重复,如果有就直接丢掉。从嵌套循环就可以看出,这种⽅法效率极低。我们可以⽤⼀个hashtable的结构记录已有的元素,这样就可以避免内层循环。恰好,在Javascript中实现hashtable是极为简单的,改进如下:
function unique(arr) {
var result = [], hash = {};
for (var i = 0, elem; (elem = arr[i]) != null; i++) {
if (!hash[elem]) {
result.push(elem);
hash[elem] = true;
}
}
return result;
}
完整测试代码
<script>
var h_hewenqiArray = new Array();
h_hewenqiArray[0] = "jb51";
h_hewenqiArray[1] = "easysector";
h_hewenqiArray[2] = "jb51";
h_hewenqiArray[3] = "keleyi";
h_hewenqiArray[4] = "keleyi";
h_hewenqiArray[5] = "";
h_hewenqiArray[6] = "jb51";
h_hewenqiArray[7] = "hoverclock";
h_hewenqiArray[8] = "yestop";
h_hewenqiArray[9] = 163;
h_hewenqiArray[10] = "";
h_hewenqiArray[11] = 163;
h_hewenqiArray[12] = "hoverclock";
h_hewenqiArray[13] = "";
var h_arrayLength = h_hewenqiArray.length;
document.write("原始数组元素个数:"+h_arrayLength + "<br />");
for (var i = 0; i < h_arrayLength; i++)
{
document.write(h_hewenqiArray[i]+"<br />");
}
function hovercUnique(arr) {
var result = [], hash = {};
for (var i = 0, elem; (elem = arr[i]) != null; i++) {
if (!hash[elem]) {
result.push(elem);
hash[elem] = true;
}
}
return result;
//jb51
}
var h_hewenqiResult = hovercUnique(h_hewenqiArray);
var h_resultLength = h_hewenqiResult.length;
document.write("<br />去重复后数组元素个数:" + h_resultLength + "<br />");
for (var i = 0; i < h_resultLength; i++) {
document.write(h_hewenqiResult[i] + "<br />");
}
</script>
以下是其它⽹友的补充
复制代码代码如下:
/// <summary>2 /// 回车键按钮事件(此⽅法需要在页⾯加载完后执⾏,⽐如在Jquery中的ready中调⽤)--⽅法⼀/// </summary>
/// 调⽤⽰例:
/// var v_Array = new Array(1, 2, 3, 4, 5, 6, 7, 3, 3, 2, 2, 4, 2, 1, 1, 3);
/// var v_ArrayResult = v_Array.deleteEle();
/// alert(v_ArrayResult); //返回结果:, 2, 3, 4, 5, 6, 7
Array.prototype.deleteEle = function () {
var o = {}, newArr = [], i, j;
for (i = 0; i < this.length; i++) {
if (typeof (o[this[i]]) == "undefined") {
o[this[i]] = "";
}
}
for (j in o) {
newArr.push(j)
}
return newArr;
}
/
// <summary>
/// 回车键按钮事件(此⽅法需要在页⾯加载完后执⾏,⽐如在Jquery中的ready中调⽤)--⽅法⼆
/// </summary>
js数组方法总结/// 调⽤⽰例:
/// var v_Array = new Array(1, 2, 3, 4, 5, 6, 7, 3, 3, 2, 2, 4, 2, 1, 1, 3);
/// var v_ArrayResult = v_Array.deleteEleReg();
/// alert(v_ArrayResult); //返回结果:, 2, 3, 4, 5, 6, 7
Array.prototype.deleteEleReg = function () {
verse().join(",").match(/([^,]+)(?!.*\1)/ig).reverse();
}
/// <summary>
/
// 回车键按钮事件(此⽅法需要在页⾯加载完后执⾏,⽐如在Jquery中的ready中调⽤)--⽅法三
/// </summary>
/// <param name="array">数组</param>
/// 调⽤⽰例:
/// var v_Array = new Array(1, 2, 3, 4, 5, 6, 7, 3, 3, 2, 2, 4, 2, 1, 1, 3);
/// alert(unique(v_Array)); //返回结果:, 2, 3, 4, 5, 6, 7
function deleteEleFunction(array) {
var ret = [], record = {}, it, tmp, obj = "__object__", bak = [], i, len;
var type = {
"number": function (n) { return "__number__" + n; },
"string": function (n) { return "__string__" + n; },
"boolean": function (n) { return "__boolean__" + n; },
"undefined": function (n) { return "__undefined__"; },
"object": function (n) {
return n === null ? "__null__" : obj in n ? n[obj] : (n[obj] = obj + bak.push(n));
}
};
for (i = 0, len = array.length; i < len; i++) {
it = array[i]; tmp = type[typeof it](it);
if (!(tmp in record)) { ret.push(it); record[tmp] = true; }
}
for (i = 0, len = bak.length; i < len; delete bak[i++][obj]) { }
return ret;
};
/// <summary>< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />
/// 回车键按钮事件(此⽅法需要在页⾯加载完后执⾏,⽐如在Jquery中的ready中调⽤)--⽅法四/// </summary>
/// 调⽤⽰例:
/// var v_Array = new Array(1, 2, 3, 4, 5, 6, 7, 3, 3, 2, 2, 4, 2, 1, 1, 3);
/// var v_ArrayResult = v_Array.deleteEleDis();
/// alert(v_ArrayResult); //返回结果:, 2, 3, 4, 5, 6, 7
Array.prototype.deleteEleDis = function () {
var a = [], b = [];
for (var prop in this) {
var d = this[prop];
if (d === a[prop]) continue; //防⽌循环到prototype
if (b[d] != 1) {
a.push(d);
b[d] = 1;
}
}
return a;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。