以下是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'
}
]
有没有办法找到重复的对象(所有键/值对)? 如果是这样 - 怎么做? 提前谢谢。
答案 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))