91网首页-91网页版-91网在线观看-91网站免费观看-91网站永久视频-91网站在线播放

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

javascript下過濾數(shù)組重復(fù)值的代碼(類似于SQL的distinct)

admin
2012年4月23日 21:51 本文熱度 12964
<script language="javascript">
function getNoRepeat() {
return arguments[0].join('‖').match(/(\b[^‖]+\b)(?!.*‖\1\b)/ig);
}
var tmpArr = [1, 'a', 'ab', 'abc', 'd', 1.2, 'a+b', 'd', 'e', 5, 'a', 1, 'h', 'c', 'ab'];
var retArr = getNoRepeat(tmpArr);
alert(retArr);
</script>

 

<script>
alert("1,11,1.11,1111,111,11,1,1.11".match(/(\b\d+(?:\.\d+)?\b)(?!.*,\1\b)/g))
</script>

 

<script>
alert("123450,0,1,2,5,3,2,12,4,1,1,123450".match(/(\b\d+\b)(?!.*,\1(,|$))/ig))
</script>

 


<script>
alert("123450,0,1,2,5,3,2,12,4,1,1,123450".match(/(\b\d+\b)(?!(?:,[^,]+)*,\1(?:,|$))/ig))
</script>

 


<script>
var s = "0,1,2,5,3,2,12,4,1,1,123450";
var sTmp = (","+s.split(",").reverse().join(",")+",").replace(/,([^,]+)(?=,.*,\1,)/ig, '').split(",").reverse().join();
sTmp = sTmp.substr(1, sTmp.length-2);
alert(sTmp)
</script>

 


<script>
var strArr = "123450,0,1,2,5,3,2,12,4,1,1,123450".split(",")
var str = ","
for(i = 0; i < strArr.length; i++)
{
if(str.indexOf("," + strArr[i] + ",") == -1)str += strArr[i] + ","
}
alert(str.substring(1,str.length - 1))
</script>

該文章在 2012/4/23 21:51:03 編輯過

全部評論5

admin
2012年4月23日 21:55

js數(shù)組中去除重復(fù)值
 
<script>
Array.prototype.del = function() {
var a = {}, c = [], l = this.length;
for (var i = 0; i < l; i++) {
var b = this[i];
var d = (typeof b) + b;
if (a[d] === undefined) {
c.push(b);
a[d] = 1;
}
}
return c;
}
alert([1, 1, 2, 3, 4, 5, 4, 3, 4, 4, 5, 5, 6, 7].del());
</script>

  [Ctrl+A 全選 注:如需引入外部Js需刷新才能執(zhí)行]
方法二
復(fù)制代碼 代碼如下:
//去重復(fù)數(shù)組
function unique(data){
data = data ││ [];
var a = {};
len = data.length;
for (var i=0; i<len;i++){
var v = data[i];
if (typeof(a[v]) == 'undefined'){
a[v] = 1;
}
};
data.length=0;
for (var i in a){
data[data.length] = i;
}
return data;
}

方法三
復(fù)制代碼 代碼如下:
var arr = ["123","123","123","123","sfsdf","123","345","123","123","345","456","567","sdc"];
var str = [];
for(var i = 0,len = arr.length;i < len;i++){
! RegExp(arr[i],"g").test(str.join(",")) && (str.push(arr[i]));
}
alert(str);

方法四
復(fù)制代碼 代碼如下:
var pureMulti1=function(arr){
var obj={};
var a = [];
for(var i=0,l=arr.length;iif(!((arr[i]+"") in obj)){
a.push(arr[i]);
}
obj[arr[i]]="";
}
return a;
}


該評論在 2012/4/23 21:56:04 編輯過
admin
2012年4月23日 21:56

百度面試時問的一道題目,蠻常規(guī)的,但是當時自己的回答挺差勁的。現(xiàn)在總結(jié)記錄下~

代碼如下:
題目:要求寫一個函數(shù),去掉給定數(shù)組中的重復(fù)值。
如:
傳入數(shù)組 a = [0, 8, 5, 4, 78, 8, 90, 4, 'a', 'b', 'a'];
要求返回:[0,4,5,8,78,90,a,b]

對于這個題目,在面試之后也想了好多次,不過一直沒能想出一個時間復(fù)雜度較低的方法。昨天下午在宿舍看《JavaScript語言精粹》看到一個書中的一段代碼有所觸發(fā),于是在jsfiddle上測試了,成功。代碼如下(完整版參見jsfiddle)
var getNR = function(src) {
src = src ││ [];
var res = {};
var curr = [];
var i, j = 0,temp, name;
for (i = 0; i < src.length; i++) {
temp = src[i];
if (res[temp]) {
//do noting
} else {
res[temp] = 1;
}
}
for (name in res) {
if (res.hasOwnProperty(name)) {
curr[j++] = name;
}
}
return curr;
};

總結(jié)一下我的思路:
思路一:將目標數(shù)組進行排序,然后依序刪除重復(fù)的數(shù)組,但這樣在刪除重復(fù)元素的同時也改變數(shù)組原有元素的屬性,明顯是不符合要求的,del。
思路二:新建一個數(shù)組b,將a中的元素push到b中,但是在push之前檢查該元素是否存在。這個時間復(fù)雜度是n*n,最簡單也是最笨的辦法。
思路三:跟思路二類似,不過充分利用了js對象的屬性,新建一個空對象,將a中的元素作為屬性添加到該對象中,在添加之前檢測該屬性是否已存在。全部添加完后將該對象的屬性依序放到數(shù)組中,return
美團面試的題目中有一道這個題目的變種:
要求在Array類上添加一個方法,對于任意數(shù)組調(diào)用該方法后,去除該數(shù)組中的重復(fù)元素。
這個變種題考查的知識點多了些,還包括原型,this的理解等。


該評論在 2012/4/23 21:57:39 編輯過
admin
2012年4月23日 22:22

三個精彩的函數(shù)~~大家收到自己的函數(shù)庫里去吧~

前兩天做一個功能的時候,為Array擴展了三個方法,可以清除數(shù)組中的重復(fù)的值。這些值可以是字符串,或者對象~~或者其它。
在網(wǎng)上找了找其它的類同的函數(shù)~效率和實現(xiàn)方法都比較差~哈哈~

---------------

// 數(shù)據(jù)元素唯一化, 較慢但保持元素順序
//   例: [1,2,3,2,1,8,1,6,2]
// 輸出: [1,2,3,8,6]
Array.prototype.unique = function() {
  for (var j, i=0, k=this.length; i<k; i++) {
    for (j=i+1; j<k; j++) {
      if (this[i]===this[j] && k--) this.splice(j, 1);
    }
  }
}

// 數(shù)據(jù)元素唯一化, 較快但不能保持元素順序
//   例: [1,2,3,2,1,8,1,6,2]
// 輸出: [1,2,3,8,6]
Array.prototype.q_unique = function() {
  for (var j, i=0, k=this.length; i<k; i++) {
    for (j=i+1; j<k; j++) {
      if (this[i]===this[j]) this[i]=this[--k];
    }
  }
  this.length = k;
}

// 數(shù)據(jù)元素唯一化, 僅用于排序過的數(shù)組(并保持排序狀態(tài))
//   例: [1,2,2,4,4,5,5]
// 輸出: [1,2,4,5]
Array.prototype.s_unique = function() {
  for (var j, m, i=0, k=this.length; i<k; i++, k-=m) {
    for (j=i+1, m=0; j<k; j++, m++) {
      if (this[i]!==this[j]) break;
    }
    this.splice(i, m);
  }
}


該評論在 2012/4/23 22:23:57 編輯過
admin
2012年4月23日 22:24
  1. <script>
  2. //Aiming 的算法
  3. //---------------
  4. // 數(shù)據(jù)元素唯一化, 較慢但保持元素順序
  5. //   例: [1,2,3,2,1,8,1,6,2]
  6. // 輸出: [1,2,3,8,6]
  7. Array.prototype.unique = function() {
  8.   for (var j, i=0, k=this.length; i<k; i++) {
  9.     for (j=i+1; j<k; j++) {
  10.       if (this[i]===this[j] && k--) this.splice(j, 1);
  11.     }
  12.   }
  13. }

  14. // 數(shù)據(jù)元素唯一化, 較快但不能保持元素順序
  15. //   例: [1,2,3,2,1,8,1,6,2]
  16. // 輸出: [1,2,3,8,6]
  17. Array.prototype.q_unique = function() {
  18.   for (var j, i=0, k=this.length; i<k; i++) {
  19.     for (j=i+1; j<k; j++) {
  20.       if (this[i]===this[j]) this[i]=this[--k];
  21.     }
  22.   }
  23.   this.length = k;
  24. }

  25. // 數(shù)據(jù)元素唯一化, 僅用于排序過的數(shù)組(并保持排序狀態(tài))
  26. //   例: [1,2,2,4,4,5,5]
  27. // 輸出: [1,2,4,5]
  28. Array.prototype.s_unique = function() {
  29.   for (var j, m, i=0, k=this.length; i<k; i++, k-=m) {
  30.     for (j=i+1, m=0; j<k; j++, m++) {
  31.       if (this[i]!==this[j]) break;
  32.     }
  33.     this.splice(i, m);
  34.   }
  35. }

  36. ///////////////////////////////////////////////////////////////////////////////////////
  37. //Akira的處理方法,利用Hash
  38. function UniqueSet()
  39. {
  40.         this.HashIndex = new Array();
  41.         this.Collection = new Array();

  42.         UniqueSet.prototype.Add = function(obj)
  43.         {
  44.                 if (!(obj instanceof Object))   //如果obj不是對象,那么就按照基本數(shù)據(jù)類型(值類型)的方式處理,注意:可能對DOM無效
  45.                 {
  46.                         if (this.HashIndex[obj] == null)
  47.                         {
  48.                                 this.HashIndex[obj] = this.Collection.length;
  49.                                 this.Collection.push(obj);
  50.                         }
  51.                 }
  52.                 else if (obj.UUID != null)  //如果對象定義了唯一表識UUID,則用UUID作為索引來處理
  53.                 {
  54.                         if (this.HashIndex[UUID] == null)
  55.                         {
  56.                                 this.HashIndex[UUID] = this.Collection.length;
  57.                                 this.Collection.push(obj);
  58.                         }                               
  59.                 }
  60.                 else
  61.                 {
  62.                         //對象的處理辦法,利用腳本特性
  63.                         if (obj.__UniqueSet_Member_Belongs_To == null)
  64.                                 obj.__UniqueSet_Member_Belongs_To = new Array();
  65.                         for (var i = 0; i < obj.__UniqueSet_Member_Belongs_To.length; i++)
  66.                         {
  67.                                 if (obj.__UniqueSet_Member_Belongs_To[i] == this)
  68.                                 {
  69.                                         return;
  70.                                 }
  71.                         }

  72.                         obj.__UniqueSet_Member_Belongs_To.push(this);
  73.                         this.Collection.push(obj);
  74.                 }
  75.         }
  76.         UniqueSet.prototype.toArray = function()
  77.         {
  78.                 return this.Collection;
  79.         }
  80. }
  81. UniqueSet.parse = function(array)
  82. {
  83.         array = array.slice(0);
  84.         var uSet = new UniqueSet();
  85.        
  86.         for (var i = 0; i < array.length; i++)
  87.         {
  88.                 uSet.Add(array[i]);
  89.         }

  90.         return uSet.toArray();
  91. }

  92. function createObjs(size)
  93. {
  94.         var objList = new Array(); //構(gòu)造測試數(shù)組
  95.         for (var i = 0; i < size; i++) //構(gòu)造對象(這部分時間不計)
  96.         {
  97.                 if (Math.random() > rate)
  98.                 {
  99.                         item = new Object();
  100.                         item.hashCode = Math.random();
  101.                 }
  102.                 objList.push(item);
  103.         }
  104.         return objList;
  105. }

  106. function uniqueTest(objList)
  107. {
  108.         var test = objList.slice(0);   //構(gòu)造測試副本
  109.         document.write("元素個數(shù):"+test.length+",重復(fù)率:"+rate+",開始計時<br/>");
  110.         var startTime = new Date().getTime(); //計時
  111.         test.unique();
  112.         var timeUsed = (new Date() - startTime)/1000;
  113.         document.write("unique()耗時:"+timeUsed+"秒,不重復(fù)元素個數(shù)"+test.length+"個<br/>");
  114. }

  115. function q_uniqueTest(objList)
  116. {
  117.         var test = objList.slice(0);   //構(gòu)造測試副本
  118.         document.write("元素個數(shù):"+test.length+",重復(fù)率:"+rate+",開始計時<br/>");
  119.         var startTime = new Date().getTime(); //計時
  120.         test.q_unique();
  121.         var timeUsed = (new Date() - startTime)/1000;
  122.         document.write("q_unique()耗時:"+timeUsed+"秒,不重復(fù)元素個數(shù)"+test.length+"個<br/>");
  123. }

  124. function uSetTest(objList)
  125. {
  126.         var test = objList.slice(0);
  127.         document.write("元素個數(shù):"+test.length+",重復(fù)率:"+rate+",開始計時<br/>");
  128.         var startTime = new Date().getTime(); //計時
  129.         test = UniqueSet.parse(test);
  130.         var timeUsed = (new Date() - startTime)/1000;
  131.         document.write("uSet()耗時:"+timeUsed+"秒,不重復(fù)元素個數(shù)"+test.length+"個<br/><br/>");
  132. }
  133. //測試開始...
  134. var rate = 0.1; //元素重復(fù)率
  135. var item = new Object();  //要插入的元素
  136. item.hashCode = Math.random(); //沒有別的意義,單純的標識
  137. var objList = createObjs(500);  //構(gòu)造一個500隨機對象的數(shù)組

  138. //下面開始測試排序:
  139. uniqueTest(objList);
  140. q_uniqueTest(objList);
  141. uSetTest(objList);

  142. objList = createObjs(800); //增加到800對象

  143. uniqueTest(objList);
  144. q_uniqueTest(objList);
  145. uSetTest(objList);

  146. objList = createObjs(1000); //增加到1000對象

  147. uniqueTest(objList);
  148. q_uniqueTest(objList);
  149. uSetTest(objList);

  150. document.write("后面因為Aiming的算法速度太慢,而IE提示會影響計時,所以不得不停止測試,僅用我的算法計時<br/>");
  151. //objList = createObjs(1200); //增加到1200對象
  152. //uSetTest(objList);

  153. objList = createObjs(1500); //增加到1500對象
  154. uSetTest(objList);

  155. document.write("很奇怪地發(fā)現(xiàn)我寫的算法得到的結(jié)果和Aiming寫的兩個算法分別得到的結(jié)果居然都不一樣??結(jié)果:隨便測試了一下...<br/>");
  156. var testArray = new Array(10,20,30,30,30,40,20,10,4);
  157. test = testArray.slice(0);
  158. test.unique();
  159. document.write("居然檢測出了Aiming的unique()函數(shù)的這個錯誤結(jié)果:<br/>原始數(shù)組:"+testArray+"<br/>結(jié)果數(shù)組:"+test+"<br/>=.=...汗...<br/>");
  160. </script>
復(fù)制代碼運行代碼另存代碼


應(yīng)該說,樓主寫的函數(shù)從代碼的角度來講,還算是不錯的,但是有下面的一些問題:
1) 沒有保存原始的數(shù)組對象,既然改寫(增加)了數(shù)組的方法,那么應(yīng)該保護原始的數(shù)組對象,否則的話array.unique()的時候破壞掉了原來的數(shù)組。
像array.slice()等系統(tǒng)庫函數(shù)這方面就做得比較好,樓主可以參考。
除非樓主是打算做成像array.push()或者array.splice()之類的“寫操作”方法,不過我個人認為將unique方法做成寫方法的話應(yīng)用價值就打折扣了。
2)方法的效率不是很高,一個簡單的測試如上...大概算到1000數(shù)量級的時候就不大行了。我利用腳本語言的特性寫了實現(xiàn)同樣功能的方法,效率會比較高一點。
腳本是解釋型語言,弱點是效率比較低,但是同時也帶來一些靈活的特性(例如動態(tài)增加屬性),活用它們可以彌補弱點。
3)一個更為致命的問題是頭兩個方法都有BUG,第三個方法我沒有測試,不知道是否正確。第一個方法(unique())居然連new Array(10,20,30,30,30,40,20,10,4);這樣簡單的Case都沒有通過,建議樓主再修改一下。

最后我要說,腳本語言雖然簡單,然而因為自由,使用起來也有各種復(fù)雜的變化。如何發(fā)揮它們的優(yōu)勢,彌補不足,其實這其中的道理并不簡單。
作為程序語言的一種,腳本語言也是“道”的一部分。在求“道”的過程中應(yīng)當多多深入探索,才會有所領(lǐng)悟,許多東西并不像表面那么簡單。在我看來,樓主的代碼也僅能算做勉強合格(去除BUG之后),所以我想勸樓主收回“精彩”二字以及后面那句話 :P

停止一些浮躁的舉動,靜下心來認真學(xué)習(xí)和研究,往往會有很多意想不到的收獲。

該評論在 2012/4/23 22:26:54 編輯過
admin
2012年4月23日 22:25
對了,各位在運行上面那個例子的時候如果IE彈出了運行速度慢的提示的話,那么最后一個(也可能是倒數(shù)第二個,具體要看提示框彈出的時間)時間就不準確了...(因為記錄的時間還包括點擊確定按鈕關(guān)閉對話框的時間) 其實主要還是因為測試用例動態(tài)創(chuàng)建隨機大數(shù)組浪費了非常多的時間,如果單獨使用的話,我的算法大概可以跑在高于10000數(shù)量級上,如果,數(shù)組元素是簡單類型而不是對象的話,還可以再提高一個數(shù)量級,但那也不是最好的算法,相信還有很多個優(yōu)秀的算法實現(xiàn)... 總體來說,javascript是非常自由的... 所以充分發(fā)揮想象和創(chuàng)造往往可以獲得“令人驚嘆”的代碼... 如果真正能做到,是非常令人佩服的(那種大牛是月影追求的目標^^) 而能夠欣賞到那樣的代碼也是非常幸運的 因為那也是一種程序界的“藝術(shù)”和“美” ^^
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點晴ERP是一款針對中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點晴PMS碼頭管理系統(tǒng)主要針對港口碼頭集裝箱與散貨日常運作、調(diào)度、堆場、車隊、財務(wù)費用、相關(guān)報表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點,圍繞調(diào)度、堆場作業(yè)而開發(fā)的。集技術(shù)的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點晴WMS倉儲管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務(wù)都免費,不限功能、不限時間、不限用戶的免費OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产精品最新 | 国产亚洲视 | 91丨九色丨国产丨 | 99热在线精品8 | 国自产拍视频 | 国产精品精品国 | 日本5级床片全免费 | 成人午夜影院在線 | 国产亚洲日韩a | 国产伦精品一区二区 | 国产福利一 | 国产午夜视频专区 | 国产中文综合乱伦 | 区三区免费中文字幕 | 国产综合一 | 成人午夜在线不卡 | 中文字幕日韩专区 | 日本5级床片全免费 | 国产香蕉尹人视频 | 国产高清视频在线 | 绿帽在线 | 日本一二三本道 | 国产视频综合 | 国产精品178页 | 99在线在线 | 日韩精品最 | 午夜在线视频影院 | 国产精品专区第5页 | 国产高清中文 | 国产日本在线播放 | 午夜福利一区在线 | 91看片婬黄大片欧 | 91大神精品全国 | 欧美在线风情观看 | 国产精品精华液网站 | 成人午夜在线不卡 | 国产欧洲在线播放 | 国产精品欧 | 国产精品专区 | 91精品免 | 欧洲在线观看视频高 |