我有一组如下所示的JSON数组,我想打印具有相同URL的重复JSON。
var temp = [
{
"name":"Allen",
"site":"www.google.com/allen"
},
{
"name":"Chris",
"site":"www.google.com/chris"
},
{
"name":"Tom Allen",
"site":"www.google.com/allen"
}
]
预期输出:
duplicate = {
"name":"Allen",
"site":"www.google.com/allen"
}
let temp = [
{
"name":"Allen",
"site":"www.google.com/allen"
},
{
"name":"Chris",
"site":"www.google.com/chris"
},
{
"name":"Tom Allen",
"site":"www.google.com/allen"
}
];
let dups = temp.reduce((r,t,i,o)=>{
o.some((x,i2)=>x.site===t.site && i!==i2) && !r.some(x=>x.site===t.site) && r.push(t);
return r;
},[]);
console.log(dups);
首先,duplicate
变量应该是一个数组,因为可能有多个重复的对象。并且第一项不应选择为重复项。你可以试试这个-
var temp = [{"name":"Allen","site":"www.google.com/allen"},{"name":"Chris","site":"www.google.com/chris"},{"name":"Tom Allen","site":"www.google.com/allen"}];
const hashMap = {};
const duplicate = [];
temp.forEach(item => {
if (hashMap[item.site] !== undefined) {
duplicate.push(item);
} else {
hashMap[item.site] = item;
}
});
console.log(duplicate);
以实用的方式:
我的函数会将所有不是第一次出现的事件都视为“重复”。 您将需要“最后一个”,只需反转集合即可。
// f: a function that receives one element from coll and returns a `key` that identify the element
// coll: any collection that implements .reduce
var duplicatesBy = (f, coll) => {
var rf = ({dups, seen}, el) => {
var id = f(el)
return {
dups: (seen.includes(id) ? [... dups, el] : dups),
seen: [... seen, id]
}
}
var { dups } = coll.reduce(rf, {dups: [], seen: []})
return dups
}
console.log(duplicatesBy(({site})=> site, temp))
//output:
// [ { name: 'Tom Allen', site: 'www.google.com/allen' } ]