JS的对象数组去重处理(二十)

本文详细介绍了一种在JavaScript中处理对象数组去重的有效方法,通过将对象转换为字符串并排序,实现对重复对象的识别与剔除,适用于有顺序不一致的重复对象情况。

也许,我本来就该成为你。

上一章简单介绍了JS的数组去重处理(十九),如果没有看过,请观看上一章

一. 对象数组的去重

如果数组中,存在的是普通的基本类型值,可看上一章的内容。 如果是对象数组,那么该如何处理呢? 主要是如何判断 两个对象是否相同呢? 在Java 中,需要重写 hashCode() 和equals() 来指明 当某些属性是一样的,就表示两个对象是相同的。 如User 实体类中, id 一致时,表示两个对象是一致的, 如果name,sex,age,description 均一致,那么这两个对象也可以是一致的。 这是程序判定是否相同的。 还有一种更简单的方法,将其toString() 转换成字符串,如果两个对象转换后的字符串是相同的,那么就说明这两个对象是相同的。 JS的判断是否对象相同,采用 toString() 转换成字符串后比较的方式。 转换成字符串时,需要将key 值 进行相应的排序,转换的是排序后的对象。 转换字符串用JSON.stringify(), 还原字符串用JSON.parse().
关于JSON的操作,可以参考老蝴蝶写的: JSON简介及前端简单解析(一)

二.对象数组去重方法

参考 jason_renyu 前辈的文章,这里非常感谢: https://blog.youkuaiyun.com/jason_renyu/article/details/79288932

所使用到的对象数据:

//有重复,有顺序不一致。
var arr= [
			{
				id: 1,
				name: '两个蝴蝶飞',
				sex:'男'
			},
			{
				id: 1,
				name: '两个蝴蝶飞',
				sex:'男',
				age:24
			},
			{
				id: 2,
				name: '两个蝴蝶飞',
				sex: '男'
			},
			{
				id:3,
				name: '精灵妹',
				sex:'女'
			},
			{
				id: 2,
				name: '两个蝴蝶飞',
				sex: '男'
			},
			{
				sex: '男',
				name: '两个蝴蝶飞',
				id: 2
			},
			{
				name: '精灵妹',
				id:3,
				sex: '女'
			},
			{
				name: '精灵妹',
				id:4,
				sex: '女'
			}
		];
	console.log("去重之前的数组为:"+JSON.stringify(arr));
	var arr1=uniqueObject(arr);
	console.log("去重之后的数组为:"+JSON.stringify(arr1));

写相应的uniqueObject 的方法.

function uniqueObject(arr){
	//存放的是字符串形式的数组。
	var tempArr = [];
	//将数组对象转成数组字符串。
	var newStr =arrToString(arr);
	newStr.sort();
	
	//先放置第一个
	var temp=newStr[0];
	tempArr.push(temp);
	// 数组去重
	for(var i=1;i<newStr.length;i++){
		if(newStr[i]!==temp){
			temp=newStr[i];  //放置到集合里面。
			tempArr.push(newStr[i]);
		}
	}
	//上面,集合还是字符串形式的数组,需要转换成json对象的形式。
	var newArr = [];
	// 新数组字符串转成数组对象
	for(var i=0;i<tempArr.length;i++){
		newArr.push(JSON.parse(tempArr[i]));
	}
	return newArr;
}

转换成字符串数组 的arrToString 方法:

/**
 * 
 * @param arr 对象数组
 * @returns {Array} 转换成字符串的数组
 */
function arrToString(arr){
	var newArr = [];
	if(arr.length !== 0){
		for(var i=0;i<arr.length;i++){ //对每一个对象数据进行处理。
			//将每一个对象里面的属性key 进行重新排序,变成新的对象。
			var thisObj = sortObject(arr[i]);
			//将json对象,转换成字符串
			var thisStr = JSON.stringify(thisObj);
			 // 去除空格及\t空白字符
			thisStr = thisStr.replace(/(\s|[\\t])/g,'');
			//里面放置字符串
			newArr.push(thisStr);
		}
	}
	return newArr;
}

将单个对象排序 key值的方法 sortObject

/**
 * 
 * @param obj 对象
 * @returns 将对象按照key值进行排序。
 */
function sortObject(obj){
	var keyArr = [];
	for(var item in obj){ //把所有的key放置在一个数组里面。
		keyArr.push(item);
	};
	keyArr.sort(); //排序,按照字符进行排序。
	var newObj = {}; //还是json对象
	for(var i=0;i<keyArr.length;i++){
		newObj[keyArr[i]] = obj[keyArr[i]] 
	}
	//处理成 键=值的数组形式。
	//console.log("值是:"+JSON.stringify(newObj));
	return newObj;
}

合并为一起运行为:

var arr= [
			{
				id: 1,
				name: '两个蝴蝶飞',
				sex:'男'
			},
			{
				id: 1,
				name: '两个蝴蝶飞',
				sex:'男',
				age:24
			},
			{
				id: 2,
				name: '两个蝴蝶飞',
				sex: '男'
			},
			{
				id:3,
				name: '精灵妹',
				sex:'女'
			},
			{
				id: 2,
				name: '两个蝴蝶飞',
				sex: '男'
			},
			{
				sex: '男',
				name: '两个蝴蝶飞',
				id: 2
			},
			{
				name: '精灵妹',
				id:3,
				sex: '女'
			},
			{
				name: '精灵妹',
				id:4,
				sex: '女'
			}
		];
	console.log("去重之前的数组为:"+JSON.stringify(arr));
	var arr1=uniqueObject(arr);
	console.log("去重之后的数组为:"+JSON.stringify(arr1));



//对应的方法处理。
function uniqueObject(arr){
	//存放的是字符串形式的数组。
	var tempArr = [];
	//将数组对象转成数组字符串。
	var newStr =arrToString(arr);
	newStr.sort();
	
	//先放置第一个
	var temp=newStr[0];
	tempArr.push(temp);
	// 数组去重
	for(var i=1;i<newStr.length;i++){
		if(newStr[i]!==temp){
			temp=newStr[i];  //放置到集合里面。
			tempArr.push(newStr[i]);
		}
	}
	//上面,集合还是字符串形式的数组,需要转换成json对象的形式。
	var newArr = [];
	// 新数组字符串转成数组对象
	for(var i=0;i<tempArr.length;i++){
		newArr.push(JSON.parse(tempArr[i]));
	}
	return newArr;
}
/**
 * 
 * @param arr 对象数组
 * @returns {Array} 转换成字符串的数组
 */
function arrToString(arr){
	var newArr = [];
	if(arr.length !== 0){
		for(var i=0;i<arr.length;i++){ //对每一个对象数据进行处理。
			//将每一个对象里面的属性key 进行重新排序,变成新的对象。
			var thisObj = sortObject(arr[i]);
			//将json对象,转换成字符串
			var thisStr = JSON.stringify(thisObj);
			 // 去除空格及\t空白字符
			thisStr = thisStr.replace(/(\s|[\\t])/g,'');
			//里面放置字符串
			newArr.push(thisStr);
		}
	}
	return newArr;
}
/**
 * 
 * @param obj 对象
 * @returns 将对象按照key值进行排序。
 */
function sortObject(obj){
	var keyArr = [];
	for(var item in obj){ //把所有的key放置在一个数组里面。
		keyArr.push(item);
	};
	keyArr.sort(); //排序,按照字符进行排序。
	var newObj = {}; //还是json对象
	for(var i=0;i<keyArr.length;i++){
		newObj[keyArr[i]] = obj[keyArr[i]] 
	}
	//处理成 键=值的数组形式。
	//console.log("值是:"+JSON.stringify(newObj));
	return newObj;
}

在这里插入图片描述可以正确的进行对象数组的去重。

三. 采用prototype 原型扩展的方式进行扩展后的形式

与上面差不多,直接写出来了。

var arr= [
			{
				id: 1,
				name: '两个蝴蝶飞',
				sex:'男'
			},
			{
				id: 1,
				name: '两个蝴蝶飞',
				sex:'男',
				age:24
			},
			{
				id: 2,
				name: '两个蝴蝶飞',
				sex: '男'
			},
			{
				id:3,
				name: '精灵妹',
				sex:'女'
			},
			{
				id: 2,
				name: '两个蝴蝶飞',
				sex: '男'
			},
			{
				sex: '男',
				name: '两个蝴蝶飞',
				id: 2
			},
			{
				name: '精灵妹',
				id:3,
				sex: '女'
			},
			{
				name: '精灵妹',
				id:4,
				sex: '女'
			}
		];
	console.log("去重之前的数组为:"+JSON.stringify(arr));
	var arr1=arr.uniqueObject(); //去重对象。
	console.log("去重之后的数组为:"+JSON.stringify(arr1));



Array.prototype.uniqueObject=function(){
	//存放的是字符串形式的数组。
	var tempArr = [];
	//将数组对象转成数组字符串。
	var newStr =this.arrToString();
	newStr.sort();
	
	//先放置第一个
	var temp=newStr[0];
	tempArr.push(temp);
	// 数组去重
	for(var i=1;i<newStr.length;i++){
		if(newStr[i]!==temp){
			temp=newStr[i];  //放置到集合里面。
			tempArr.push(newStr[i]);
		}
	}
	//上面,集合还是字符串形式的数组,需要转换成json对象的形式。
	var newArr = [];
	// 新数组字符串转成数组对象
	for(var i=0;i<tempArr.length;i++){
		newArr.push(JSON.parse(tempArr[i]));
	}
	return newArr;
}

Array.prototype.arrToString=function(){
	var newArr = [];
	if(this.length !== 0){
		for(var i=0;i<this.length;i++){ //对每一个对象数据进行处理。
			//将每一个对象里面的属性key 进行重新排序,变成新的对象。
			var thisObj = this[i].sortObject();
			//将json对象,转换成字符串
			var thisStr = JSON.stringify(thisObj);
			 // 去除空格及\t空白字符
			thisStr = thisStr.replace(/(\s|[\\t])/g,'');
			//里面放置字符串
			newArr.push(thisStr);
		}
	}
	return newArr;
}

//是Object 对象的扩展
Object.prototype.sortObject=function(){
	var keyArr = [];
	for(var item in this){ //把所有的key放置在一个数组里面。
		keyArr.push(item);
	};
	keyArr.sort(); //排序,按照字符进行排序。
	var newObj = {}; //还是json对象
	for(var i=0;i<keyArr.length;i++){
		newObj[keyArr[i]] = this[keyArr[i]] 
	}
	//处理成 键=值的数组形式。
	return newObj;
}

方法名可能与JavaScript 本身提供的方法名相同,可以将方法名自定义改变 即可。 为了描述性强,这里暂时没有更改。

谢谢!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个蝴蝶飞

你的鼓励,是老蝴蝶更努力写作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值