使用Node JS在控制台中打印重复的JSON数组

发布时间:2020-07-07 16:08

我有一组如下所示的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"
}
回答1

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);
回答2

首先,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);
回答3

以实用的方式:

我的函数会将所有不是第一次出现的事件都视为“重复”。 您将需要“最后一个”,只需反转集合即可。

// 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' } ]