js 去重及去掉数组中的空值

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]

 

posted on 2019-03-08 18:26  solorhythm  阅读(13989)  评论(0编辑  收藏  举报