国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

javascript 刪除數組中重復項(uniq)

2024-05-06 14:11:45
字體:
來源:轉載
供稿:網友
可以直接使用的代碼:錯新站長站修正版

[Ctrl+A 全選 注:如需引入外部Js需刷新才能執行]
下面是進階教程與說明,喜歡跟深入的朋友可以參考下。
首先讓我們看下 YUI 是如何處理的:
代碼如下:
var toObject = function(a) {
var o = {};
for (var i = 0; i < a.length; i = i+1) {
o[a[i]] = true;
}
return o;
};

var keys = function(o) {
var a=[], i;
for (i in o) {
if (lang.hasOwnProperty(o, i)) { // YUI的方法
a.push(i);
}
}
return a;
};

var uniq = function(a) {
return keys(toObject(a));
};

詳細分析,見同事 長天 的分享 《巧妙去除數組中的重復項》。

自己使用的方式與 YUI 的方式十分相似,不過僅使用了一次循環便完成了刪除數組中重復項,如下:
代碼如下:
var uniq = function (arr) {
var a = [],
o = {},
i,
v,
len = arr.length;

if (len < 2) {
return arr;
}

for (i = 0; i < len; i++) {
v = arr[i];
if (o[v] !== 1) {
a.push(v);
o[v] = 1;
}
}

return a;
}

經過了簡單的測試:自己使用的方式性能遠遠高于 YUI 的方式。

拋磚引玉,歡迎大家提供更好的處理方法。

2009年12月28日更新:

以上兩種函數方法暫時都不能處理復雜的含有混合類型的數組(感謝 小貓 提出的疑問),如:[0,"0",1,"1",0]、["null",null]。

對于能夠約定類型為數字(注:要求非0開頭的數字,小數除外)或字符串的數組,我們可以用改進后的函數方法(感謝 closurecache 提供的思路):
代碼如下:
var uniq = function (arr) {
var a = [],
o = {},
i,
v,
cv, // corrected value
len = arr.length;

if (len < 2) {
return arr;
}

for (i = 0; i < len; i++) {
v = arr[i];

/* closurecache 提供的函數中使用的是 cv = v + 0;,
* 這樣就無法辨別類似[1, 10, "1", "10"]的數組,
* 因為運算后 => 1, 10, 10, 100,很明顯,出現了重復的標示符。
* 加前面就難道沒問題嗎?
* 有的:數組中不能出現類似01 、001,以 0 開頭的數字,
* 但適用性比原先更廣。
*/
cv = 0 + v;

if (!o[cv]) {
a.push(v);
o[cv] = true;
}
}

return a;
}

如果大家想在此解題思路的基礎上,更完美一點,推薦 Dexter.Yy 的方法,進行類型判斷,給予唯一標示符,詳見 評論 20 樓。

沒有最好,只有最合適的方式,其實使用 Array.indexOf() 的思路也是不錯的選擇,對于已經支持的瀏覽器直接用原生的 Array.indexOf() 方法,對于未支持的,我們增加 Array.indexOf() 方法,如下:
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 如东县| 临城县| 民县| 汕头市| 镇平县| 崇义县| 马公市| 城固县| 新邵县| 麻阳| 潞城市| 阿拉善右旗| 芮城县| 宝山区| 明溪县| 集贤县| 葫芦岛市| 耿马| 泗阳县| 边坝县| 任丘市| 厦门市| 贵定县| 芜湖市| 肇庆市| 甘泉县| 诸暨市| 泰兴市| 宁武县| 灵台县| 阿城市| 武邑县| 阳高县| 东方市| 利川市| 保德县| 土默特右旗| 息烽县| 乐至县| 峨眉山市| 金秀|