本文是参考了一篇文章后进行的扩展,参考文章地址https://blog.csdn.net/yjltx1234csdn/article/details/93766707
以下代码可以直接复制,进行工具的使用(本人主学后端,所以js可能写的差,请见谅!)
/**
* 实现自定义数组对象去重
* @param arr 去重的数组 前提保证数组中的对象包含需要的去重的标志属性
* @param attributes 自定义的对象的属性 数组 标志属性组
* @return newArr 根据标志属性去重的数组
*/
function customDeweighting (arr,attributes) {
/*
1.根据特定的属性对比,需要先获取一个新的数组
2.利用indexof函数对字符串数组进行判断,如果不存在就加入到新的数组里面,进行返回
*/
let newStr = [];
let newArr =[];
for (let i=0;i<arr.length;i++){
let temp = {}; //还是json对象
let obj = arr[i];
for(let j=0;j<attributes.length;j++){
temp[attributes[j]] = obj[attributes[j]];
}
let thisStr = JSON.stringify(temp);
// 去除空格及\t空白字符
thisStr = thisStr.replace(/(\s|[\\t])/g,'');
if (newStr.indexOf(thisStr)===-1){
newStr.push(thisStr);
newArr.push(arr[i]);
}
}
return newArr;
}
/**
*add方法,保证一个数组添加以后没有重复的值,必须保证添加的目的数组是无重复的元素的
* @param arr 无重复无元素的目的数组
* @param item 添加的对象
* @returns {[]}
*/
function addUnique(arr,item) {
//将数组对象转换为数组字符串
let newStr = arrToString(arr);
newStr.sort();
//先放置第一个
let temp = itemToString(item);
// 数组去重
let flag = false;
for(let i=0;i<newStr.length;i++){
if(newStr[i]===temp){
flag = true;
}
}
if (!flag){
arr.push(item);
}
return arr;
}
/**
* 也是在一个数组里面添加一个元素,但是arr是包含有重复元素的
* @param arr 包含有重复元素的目的数组
* @param item 要添加的元素
* 备注 感觉这个方法没神魔用
*/
function addUniqueArr(arr,item) {
arr.push(item);
return uniqueObject(arr);
}
/**
* 数组去重主方法
* @param arr 进行去重的数组
* @returns {[]}
*/
function uniqueObject(arr){
//存放的是字符串形式的数组。
let tempArr = [];
//将数组对象转成数组字符串。
let newStr =arrToString(arr);
newStr.sort();
//先放置第一个
let temp=newStr[0];
tempArr.push(temp);
// 数组去重
for(let i=1;i<newStr.length;i++){
if(newStr[i]!==temp){
temp=newStr[i]; //放置到集合里面。
tempArr.push(newStr[i]);
}
}
//上面,集合还是字符串形式的数组,需要转换成json对象的形式。
let newArr = [];
// 新数组字符串转成数组对象
for(let i=0;i<tempArr.length;i++){
newArr.push(JSON.parse(tempArr[i]));
}
return newArr;
}
/**
*将数组转换为 字符串数组
* @param arr 对象数组
* @returns {Array} 转换成字符串的数组
*/
function arrToString(arr){
let newArr = [];
if(arr.length !== 0){
for(let i=0;i<arr.length;i++){ //对每一个对象数据进行处理。
//将每一个对象里面的属性key 进行重新排序,变成新的对象。
let thisStr = itemToString(arr[i]);
//里面放置字符串
newArr.push(thisStr);
}
}
return newArr;
}
/**
* 将元素转换为字符串
* @param item
* @returns {string}
*/
function itemToString(item) {
//将每一个对象里面的属性key 进行重新排序,变成新的对象。
let thisObj = sortObject(item);
//将json对象,转换成字符串
let thisStr = JSON.stringify(thisObj);
// 去除空格及\t空白字符
thisStr = thisStr.replace(/(\s|[\\t])/g,'');
return thisStr;
}
/**
*
* @param obj 对象
* @returns 将对象按照key值进行排序。
*/
function sortObject(obj){
let keyArr = [];
for(let item in obj){ //把所有的key放置在一个数组里面。
keyArr.push(item);
};
keyArr.sort(); //排序,按照字符进行排序。
let newObj = {}; //还是json对象
for(let i=0;i<keyArr.length;i++){
newObj[keyArr[i]] = obj[keyArr[i]]
}
//处理成 键=值的数组形式。
//console.log("值是:"+JSON.stringify(newObj));
return newObj;
}
以上方法亲测有效。