JS数组对象去重及求差值

12577次浏览

前言

之前文章有对数组去重及求差值做总结,可以参考文章js数组并集,交集,差集的计算方式汇总,去重的方式面试中经常提到,可以参考。 数组是这么操作,有小伙伴问数组对象应该如何操作呢? 显然,数组对象和数组的操作方式还是有点区别的。这篇文章简单总结一下。

去重

之前纯数组去重的方式,对数组对象来说,显然不是很合适。提供2中思路

1、利用临时对象存储key的方式

这种方式之前我是经常这么用,包括处理数据的时候。

方式如下:

  let result = [];
    let obj = {};
    for(let i =0; i<arr.length; i++){
       if(!obj[arr[i].key]){
          result.push(arr[i]);
          obj[arr[i].key] = true;
       }
    }

result就是去重之后的结果。

当然,你也可以封装成函数

function removeArrayRepaetObj(arr){
      let result = [];
        let obj = {};
        for(let i =0; i<arr.length; i++){
           if(!obj[arr[i].key]){
              result.push(arr[i]);
              obj[arr[i].key] = true;
           }
        }
    return result
}

2、利用数组reduce方法

function removeArrayRepaetObj(arr){
  let obj = {};
  arr = arr.reduce(function(item, next) {
  obj[next.key] ? '' : obj[next.key] = true && item.push(next);
  return item;
 }, []);
 return arr
}

数组对象求差值

数组对象求差值的方法有很对,基于原来文章数组求差值,我们可以用JSON. stringify的方式,当时这种方式是有弊端的。方法如下:

1、JSON.stringify对象的方式

 function diffrence(a,b){
      a = a.map(JSON.stringify);
      b = b.map(JSON.stringify);
      return a.concat(b).filter(v => !a.includes(v) || !b.includes(v)).map(JSON.parse)
  }
  diffrence(arr1,arr2);

2、reduce的方式

function getDifference(arr1,arr2,typeName){
                return Object.values(arr1.concat(arr2).reduce((acc,cur) => {
                    if (acc[cur[typeName]] && acc[cur[typeName]][typeName] === cur[typeName]) {
                        delete acc[cur[typeName]];
                    }else{
                        acc[cur[typeName]] = cur;
                    }
                    return acc ;
                },{}));
            }

注意:typeName是对象中的唯一值。

方法三,采用辅助判断方法

function getDiffCollection(arr1, arr2) {
    if(!Array.isArray(arr1) || !Array.isArray(arr2)) return null;

    const longArr = arr1.length > arr2.length ? arr1 : arr2;

    const diffCollect = longArr.reduce((acc, cv, index, arr) => {
        if(!arr1[index] || !arr2[index]) acc.push(cv)
        if(arr1[index] && arr2[index] && !equalObject(arr1[index], arr2[index])) acc.push(cv)
        return acc

    }, [])
    return diffCollect;
}

function equalObject(o1, o2) {
    for(const attr in o1) {
        if(o1.hasOwnProperty(attr)) {

            if(o1[attr] !== o2[attr]) return false
        }
    }
    return true
}

这个方法比较麻烦。

小结

暂时总结这么多,交集和并集比较好操作,暂时就不总结了。

Tags: js数组对象去重差值

相关文章: