数组去重的两种需求
1.根据对象中的某一属性名来进行去重, 这种相对比较简单.
2.对象中的所有的属性的值都要对比一下,所有的属性名的值都相等,才去掉.
- 给一个例子,假设数组是这样的(这个数组是从网上随便拷贝过来的,不好意思哈)
var oldArr = [
{id:1,name:"zhangs",age:18,contact_id:1},
{id:2,name:"zhangs",age:18,contact_id:2},
{id:3,name:"zhangs",age:18,contact_id:3},
{id:4,name:"zhangs",age:18,contact_id:14},
{id:1,name:"zhangs",age:18,contact_id:3},
{id:1,name:"zhangs",age:18,contact_id:2},
{id:1,name:"zhangs",age:18,contact_id:1}
];//原数据数组
1.根据对象中的某一属性名来进行去重
/**
list:你要去重的数组
attrName : 你要根据哪个属性名来进行去重
*/
function fn(list,attrName) {
if(!(list instanceof Array)) {
return 0
}
if (!!attrName === false) {
return -1
}
var newList = []
for (var i = 0; i < list.length; i++) {
var flag = true;
for (var j = 0; j < newList.length; j++) {
if (list[i][attrName] == newList[j][attrName]) {
flag = false;
};
};
if (flag) {
newList.push(list[i]);
};
};
return newList;
}
//调用
var newArr = fn(oldArr,'id');
console.log(newArr);
2.对象中的所有的属性的值都要对比一下,所有的属性名的值都相等,才去掉
- 方法一(建议直接复制代码)
function unquireObjectInArray(array) {
if (!(array instanceof Array)) {
return -1
}
var newArr = []
var duplicates = [] // 记录已比较过得重复项下标
for (var i = 0; i < array.length; i++) {
if (i && duplicates.indexOf(i) > -1) {
continue
}
for (var j = i + 1; j < array.length; j++) {
if (_compareObj(array[i], array[j])) {
duplicates.push(j)
}
}
newArr.push(array[i])
}
return newArr
function _compareObj(a,b) {
var keysA = Object.keys(a)
var keysB = Object.keys(b)
if (keysA.length !== keysB.length) {
return false
}
var isSame = true
keysA.forEach(function(v) {
if (b[v] !== a[v]) {
isSame = false
}
})
return isSame
}
}
//调用
var result = unquireObjectInArray(oldArr);
console.log(result);
- 方法二
function unquireObjectInArray(array) {
if (!(array instanceof Array)) {
return -1
}
var newArr = [array[0]]
for (var i = 1; i < array.length; i++) {
var isIn = false
for (var j = 0; j < newArr.length; j++) {
if (_compareObj(array[i], newArr[j])) {
isIn = true
break
}
}
if (!isIn) {
newArr.push(array[i])
}
}
return newArr
function _compareObj(a, b) {
var keysA = Object.keys(a)
var keysB = Object.keys(b)
if (keysA.length !== keysB.length) {
return false
}
var isSame = true
keysA.forEach(function (v) {
if (b[v] !== a[v]) {
isSame = false
}
})
return isSame
}
}
//调用
var result = unquireObjectInArray(oldArr);
console.log(result);
3.附赠: 比较两个对象是否相同(不考虑深层嵌套及undefined值)
// 比较两个对象是否相同(不考虑深层嵌套及undefined值)
/**
a:对象一
b:对象二
*/
function compareObj(a, b) {
const keysA = Object.keys(a)
const keysB = Object.keys(b)
if (keysA.length !== keysB.length) {
return false
}
var isSame = true
keysA.forEach(v => {
if (b[v] !== a[v]) {
isSame = false
}
})
return isSame
}