如何在数组中找到完全重复的对象?

时间:2017-06-08 16:43:01

标签: javascript jquery arrays json object

以下是js数组的示例:

var arr = [
  {
    name: 'test1',
    price: 20,
    otherKey: 123,
    yetAnotherKey: 'val'
  },
  {
    name: 'test2',
    price: 10,
    otherKey: 11,
    yetAnotherKey: 'erewrwert'
  },
  {
    name: 'test1',
    price: 20,
    otherKey: 123,
    yetAnotherKey: 'val'
  }
]

有没有办法找到重复的对象(所有键/值对)? 如果是这样 - 怎么做? 提前谢谢。

5 个答案:

答案 0 :(得分:3)

关于这个问题有很多主题,从深度映射到外部库(可以推荐下划线),但大多数情况下都使用JSON字符串。不是最佳的,但最容易使用。结合ES6 Set,可以通过以下方式获得唯一对象:

arr = [...new Set(arr.map(JSON.stringify))].map(JSON.parse);

var arr = [
  {
    name: 'test1',
    price: 20,
    otherKey: 123,
    yetAnotherKey: 'val'
  },
  {
    name: 'test2',
    price: 10,
    otherKey: 11,
    yetAnotherKey: 'erewrwert'
  },
  {
    name: 'test1',
    price: 20,
    otherKey: 123,
    yetAnotherKey: 'val'
  }
];

arr = [...new Set(arr.map(JSON.stringify))].map(JSON.parse);

console.log(arr);

答案 1 :(得分:1)

您是否尝试过Undescore JS库?

  

uniq_.uniq(array,[isSorted],[iteratee])别名:唯一   生成数组的无副本版本,使用===来测试对象相等性。特别是仅保留每个值的第一次出现。如果您事先知道数组已排序,则为isSorted传递true将运行更快的算法。如果要根据转换计算唯一项,请传递iteratee函数。

     

_.uniq([1,2,1,4,1,3]);

     

=> [1,2,4,3]

由于您要实现对象,因此以下是使用_.uniq()的大量解决方案,您可能需要查看这些解决方案 - Removing duplicate objects with Underscore for Javascript

答案 2 :(得分:1)

一种天真的方法:注意使用forEach的效率低下。即使找到匹配项,也会对所有项目进行强制迭代。

var arr = [
      {
        name: 'test1',
        price: 20,
        otherKey: 123,
        yetAnotherKey: 'val'
      },
      {
        name: 'test2',
        price: 10,
        otherKey: 11,
        yetAnotherKey: 'erewrwert'
      },
      {
        name: 'test1',
        price: 20,
        otherKey: 123,
        yetAnotherKey: 'val'
      }
    ]

    function findFirstDuplicate(arr) {
      var retval = null
      arr.forEach(function(item) {
        arr.forEach(function(item2) {
            if(JSON.stringify(item) == JSON.stringify(item2)) {
            retval = item;
          }
        });
      });

      return retval;
    }

    console.log(findFirstDuplicate(arr));

答案 3 :(得分:0)

假设仅仅决定对象o1是否与o2重复,您可以尝试以下方法:

function isDuplicate(o1, o2) {
  return JSON.stringify(o1) == JSON.stringify(o2);
}

答案 4 :(得分:0)

我的解决方案使用带有stringified元素的地图作为关键

var arr = [
      {
        name: 'test1',
        price: 20,
        otherKey: 123,
        yetAnotherKey: 'val'
      },
      {
        name: 'test2',
        price: 10,
        otherKey: 11,
        yetAnotherKey: 'erewrwert'
      },
      {
        name: 'test1',
        price: 20,
        otherKey: 123,
        yetAnotherKey: 'val'
      }
    ]

function solution(arr) {
  let map = new Map();
  let res = [];
  arr.forEach(e => {
    let currKey = JSON.stringify(e);
    // if not seen by the map, put in the the map and push element to result array
    if (!map.get(currKey)) {
      map.set(currKey, true);
      res.push(e);
    } 
  });
  return res;
}

console.log(solution(arr))