//**************** 數組去重的幾種方法****************/
//參考: http://php.js.cn/blog/array-unique-in-javascript/#comment2665
// http://segmentfault.com/q/1010000000197274
//方法一:用indexOf()查找,indexOf()只支持ie9+
//而且性能不好,js引擎需要反覆找多次
function unique1(src){
var result = [];
for (var i = 0; i < src.length; i++){
// 看能不能找到
if (result.indexOf(src[i]) == -1) {
result.push(src[i]);
}
}
return result;
}
console.log(unique1([1, 3, 5, 7, 5, 3]));
console.log(unique1(['e','a','r','a']));
//方法2: hash表,兼容性良好
console.log('方法2: hash表,兼容性良好');
Array.prototype.unique2 = function(){
var h = {},
result = [];
for (var i = 0; i < this.length; i++){
// 看flag是否存在,若不存在,則hash,且壓棧
if (!h[this[i]]) {
result.push(this[i]);
h[this[i]] = true;
}
}
console.log(h);
return result;
}
console.log([1, 3, 5, 7, 5, 3,3].unique2());
console.log(['e','a','r','a'].unique2());
第二種方法有個侷限,就是作爲下標會被轉換爲字符串,這樣1, ‘1’等不同類型的值會對應到同一個下標而被去重,但實際應該保留。
把 hash 表的值從 true 改爲一個數組,裏面保存出現過的類型就行了。
Array.prototype.unique = function()
{
var n = {}, r = [], len = this.length, val, type;
for (var i = 0; i < this.length; i++) {
val = this[i];
type = typeof val;
if (!n[val]) {
n[val] = [type];
r.push(val);
} else if (n[val].indexOf(type) < 0) {
n[val].push(type);
r.push(val);
}
}
return r;
}
// 數組去重
function uniqArray (arr) {
var obj = {};
var r = [];
for (var i = 0; i < arr.length; i++) {
obj[arr[i]] = typeof arr[i];
}
for (var i in obj) {
if (obj[i] === “number”) {
r.push(Number(i));
continue;
}
r.push(i);
}
return r;
}
var a = [1,3,2,1,2,”bb”,”cc”,”bb”];
// 數組去重 2
function uniqArray (arr) {
var r = [];
for (var i = 0; i < arr.length; i++) {
if (r.indexOf(arr[i]) === -1) {
r.push(arr[i]);
}
}
return r;
}
var a = [1,3,2,1,2,”bb”,”cc”,”bb”];
// 數組去重 3
function uniqArray (arr) {
var r = [];
for (var i = 0; i < arr.length; i++) {
var common = false;
for (var j = 0; j < r.length; j++) {
if (arr[i] === r[j]) {
common = true;
}
}
if (!common) {
r.push(arr[i]);
}
}
return r;
}
var a = [1,3,2,1,2,”bb”,”cc”,”bb”];
// 數組去重 4
function uniqArray(arr) {
var obj = {},
r = [],
len = arr.length,
type,
val;
for (var i = 0; i < len; i++) {
val = arr[i];
type = typeof val;
if (!obj[val]) {
r.push(val);
obj[val] = [type];
} else if (obj[val].indexOf(type) < 0) {
// 若類型不同,則push
r.push(val);
obj[val].push(type);
}
}
return r;
}
var a = [1,3,2,1,2,”bb”,”cc”,”bb”];