0

What is the efficient way to return array with only duplicates?

array = [
{ name: 'name1', description:'desc1', place:'place1' },
{ name: 'name1', description:'desc1', place:'place2' },
{ name: 'name3', description:'desc3', place:'place3' },
{ name: 'name4', description:'desc4', place:'place4' },
{ name: 'name4', description:'desc4', place:'place4' },
{ name: 'name5', description:'desc5', place:'place5' }
]

In this case, we are only required to check the name and description properties for duplicates. Results should return:

duplicates = [
{ name: 'name1', description:'desc1', place:'place1' },
{ name: 'name4', description:'desc4', place:'place4' },
]

Any easy way of doing this?

1
  • What's your current code? (if you can't do it, why asking for a efficient way?) Commented Jan 28, 2018 at 8:59

2 Answers 2

3

Filter the array, and use a Set to check if the name and description already appeared, if so add to the output. If not add to Set:

const array = [{"name":"name1","description":"desc1","place":"place1"},{"name":"name1","description":"desc1","place":"place2"},{"name":"name3","description":"desc3","place":"place3"},{"name":"name4","description":"desc4","place":"place4"},{"name":"name4","description":"desc4","place":"place4"},{"name":"name5","description":"desc5","place":"place5"}]

const result = array.filter(function({ name, description }) {
  const key = `${name}-${description}`
  
  return this.has(key) || !this.add(key)
}, new Set())

console.log(result)

To show only one duplicate of each name and description group, use a Map instead, and count the number of appearances. Show only if the number is 2.

const array = [{"name":"name1","description":"desc1","place":"place1"},{"name":"name1","description":"desc1","place":"place2"},{"name":"name3","description":"desc3","place":"place3"},{"name":"name4","description":"desc4","place":"place4"},{"name":"name4","description":"desc4","place":"place4"},{"name":"name4","description":"desc4","place":"place4"},{"name":"name5","description":"desc5","place":"place5"}]

const result = array.filter(function({ name, description }) {
  const key = `${name}-${description}`
  const status = (this.get(key) || 0) + 1
  this.set(key, status)
  
  return status === 2
}, new Map())

console.log(result)

A solution for IE11 based on the Map solution:

const array = [{"name":"name1","description":"desc1","place":"place1"},{"name":"name1","description":"desc1","place":"place2"},{"name":"name3","description":"desc3","place":"place3"},{"name":"name4","description":"desc4","place":"place4"},{"name":"name4","description":"desc4","place":"place4"},{"name":"name4","description":"desc4","place":"place4"},{"name":"name5","description":"desc5","place":"place5"}]

const result = array.filter(function(o) {
  const key = o.name + '-' + o.description
  const status = (this.get(key) || 0) + 1
  this.set(key, status)
  
  return status === 2
}, new Map())

console.log(result)

Sign up to request clarification or add additional context in comments.

2 Comments

@OriDrori This does not in IE11. Any other solution?
Both Set and Map work in IE11. The problems are the destructuring and the template literal. I haven't worked without a transpiler or with IE in eons :) I've added a solution based on the Map that works in IE11.
0

This would would work for duplicates of 2.

let array = [
{ name: 'name1', description:'desc1', place:'place1' },
{ name: 'name1', description:'desc1', place:'place2' },
{ name: 'name3', description:'desc3', place:'place3' },
{ name: 'name4', description:'desc4', place:'place4' },
{ name: 'name4', description:'desc4', place:'place4' },
{ name: 'name5', description:'desc5', place:'place5' }
]

   
let duplicates = array.reverse()
            .filter((el,index)=> {
                let isDuplicate = index !== array.findIndex(({name,description})=> el.name === name && el.description === description);
               return isDuplicate});
              

              
console.log(duplicates)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.