数组对象去重(和 比较两个对象是否相同)

数组去重的两种需求

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
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值