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

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

一. 对象数组的去重

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

二.对象数组去重方法

参考 jason_renyu 前辈的文章,这里非常感谢

所使用到的对象数据:

//有重复,有顺序不一致。
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;
}

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

可以正确的进行对象数组的去重。

三. 采用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 本身提供的方法名相同,可以将方法名自定义改变 即可。 为了描述性强,这里暂时没有更改。

谢谢!!!