1.數組去重
var arr = ["1343", "rere", "1343", "rerd"];
Array.prototype.unique = function(){
var res = [];
var json = {};
for(var i = 0; i < this.length;i++){
if(!json[this[i]]){
res.push(this[i]);
json[this[i]] = 1;
}
}
console.log(json);//{1343: 1, rere: 1, rerd: 1}
return res;
}
console.log(arr.unique());//["1343", "rere", "rerd"]
var qcsz = arr.unique().join("、");//可以轉換為字符串
console.log(qcsz);//1343、rere、rerd
思路:先創建一個空數組,和空對象;循環遍歷數組元素;若是json[this[i] 是 undefined,則 !undefined 為 true,通過 res.push 將元素存到新的數組里,並且用json[this[i]] = 1的方法,給json對象增加新的屬性;若是 json[this[i] 不為 undefined,為已賦值的1,則說明元素已存在,則不進入函數體;故可起到函數去重的作用。
Array.prototype.unique方法是為 Array的原型上,增加一個unique方法,這樣所有的array都可以去繼承這個方法,其中的this,指向調用unique方法的數組;
判斷依據:
console.log(!undefined);//true
console.log(!1);//false
console.log(!-1);//false
對象增加屬性示例:
var obj = {};
console.log(obj);//{}
obj["arr"] = 1;
console.log(obj);//{arr: 1}
console.log(obj["arr"]);//1
console.log(obj.arr);//1
以上方法有個bug,若數組為var arr = [1,34,4,2,5,"1",3,4,"2"] 時,使用該方法去重后,數組內容將是:[1, 34, 4, 2, 5, 3];
可以使用indexOf()方法,實現去重。//indexOf() 方法可返回某個指定的字符串值在字符串中首次出現的位置。
var arr = [1,34,4,2,5,"1",3,4,"2"];
var temp = [];
function uniqe(arr){
for(var i=0;i<arr.length;i++){
if(arr.indexOf(arr[i]) == i){
temp.push(arr[i]);
}
}
return temp;
}
uniqe(arr);//[1, 34, 4, 2, 5, "1", 3, "2"]
也可以使用ES6 提供了新的數據結構 Set,它類似於數組,但是成員的值都是唯一的,沒有重復的值
let arr = [3, 5, 2, 2, 5, 5,"3","acd"]; let unique = [...new Set(arr)]; console.log(unique);//[3, 5, 2, "3", "acd"]
向 Set 加入值的時候,不會發生類型轉換,所以3和"3"是兩個不同的值。Set 內部判斷兩個值是否不同,使用的算法叫做“Same-value-zero equality”,它類似於精確相等運算符(===),主要的區別是NaN等於自身,而精確相等運算符認為NaN不等於自身。在 Set 內部,兩個NaN是相等,兩個對象總是不相等的。
2.數組對象去重
var arr = [
{orgId:"100",orgName:"信息組"},
{orgId:"100",orgName:"信息組"},
{orgId:"100",orgName:"信息組"},
{orgId:"81",orgName:"安全組"},
{orgId:"11",orgName:"秘書組"},
{orgId:"81",orgName:"安全組"}
];
var newArr = [];
var obj={};
//比較數組內的屬性,並將其添加為obj的對象
for (var i = 0, length = arr.length; i < length; i++) {
//如果obj的orgid存在,說明已經重復
if(!obj[arr[i].orgId]){
newArr.push(arr[i])
/為obj的orgid屬性賦值
obj[arr[i].orgId]=-1// -1或者 1 都行,只要是給非0數字即可
}
}
console.log(newArr) //這就是去重后的數組對象
3.去掉數組中的空值
var newArr = [1,4,"143",,"ste",,123,"",34];
function removeEmpty(arr){
for(var i = 0; i < arr.length; i++) {
if(arr[i] == "" || typeof(arr[i]) == "undefined") {
arr.splice(i,1);
i = i - 1; // i - 1 ,因為空元素在數組下標 2 位置,刪除空之后,后面的元素要向前補位
}
}
return arr;
};
removeEmpty(newArr);//[1, 4, "143", "ste", 123, 34]
