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]