js数组去重

  • 使用 new Set(arr)
    包含对象,去重效果不好
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}];
console.log([...new Set(arr)]); //  [1, 'true', true, 15, false, undefined, null, NaN, 'NaN', 0, 'a', {…}, {…}]
  • 使用 obj.hasOwnProperty()
    包含对象,去重效果不好
function unique(arr) {
    var obj = {};
    return arr.filter(function(item, index, arr) {
      return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
    })
}
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN,'NaN', 0, 0, 'a', 'a', {}, {}, {name: 1}, {name: 2}, {name: 1,}];
console.log(unique(arr))
// [1, 'true', true, 15, false, undefined, null, NaN, 'NaN', 0, 'a', {…}]
  • 方法3
var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN,NaN,'NaN', 0, 0, 'a', 'a', {}, {}, {name: 2},{name: 1}];
console.log(arrDuplicateRemoval(arr))
// [ 1, 'true', true, 15, false, undefined, null, NaN, 'NaN', 0, 'a', {}, { name: 2 }, { name: 1 }]

/**
 * 数组去重
 * @param {array} arr 
 * @returns 去重完毕的数组
 */
 function arrDuplicateRemoval(arr = []) {
  if(!Array.isArray(arr) || arr.length <= 0) return "请传入数组";
  var obj = {}, objArr = [];
  return arr.filter(item => {
    // typeof null (array、object) === "object" true
    if(item && typeof item === "object" && !Array.isArray(item)) {
      var identical = true
      objArr.forEach((objItem) => objIdentical(objItem, item) || (identical = false))
      identical && objArr.push(item);
      return identical
    }
    return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true);
  })
}

/**
 * 判断 object 是否相同
 * @param {object} obj1 
 * @param {object} obj2 
 * @returns {boolean} true 不同;false 相同
 */
function objIdentical(obj1, obj2) {
  if( Array.isArray(obj1) || Array.isArray(obj2) || typeof obj1 !== "object" || typeof obj2 !== "object") return true
  arrKey1 = Object.keys(obj1);
  if(arrKey1.length !== Object.keys(obj2).length) return true
  for(let i = 0; i < arrKey1.length; i++) {
    if(obj1[arrKey1[i]] !== obj2[arrKey1[i]]) return true
  }
  return false
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值