kittu
kittu

Reputation: 7018

How object hash works to remove duplicates in this scenario?

function distinctUnion(arr, arr2) {
  let merged = [...arr, ...arr2];
  var result = [];
  var map = {}
  for (let i = 0; i < merged.length; i++) {
    if (!map.hasOwnProperty(merged[i])) {
      map[merged[i]] = true; // Line 3 --> if I remove this line, it prints duplicates
      console.log('map', JSON.stringify(map, 2, null));
      result.push(merged[i]);
    }
  }
  return result;
}

let arr = [3, 4, 5, 6, 6, 4, 5, 8, 9, 10, 10];
let arr2 = [11, 11, 11, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6];
console.log('unique ', JSON.stringify(distinctUnion(arr, arr2), 2, null));

All we are setting here is map[merged[i]] = true; for all keys in object

map {"3":true,"4":true,"5":true,"6":true,"8":true,"9":true,"10":true,"11":true}

then how result.push(merged[i]) has only unique values?

I mean to say merged[i] inside loop should still have all array values including duplicates right?

I am not able to understand the link between map[merged[i]] = true; and result.push(merged[i])

Upvotes: 0

Views: 90

Answers (2)

Arun Saini
Arun Saini

Reputation: 7814

To make your code works, you just need to replace map[merged[i]] = true; with map[merged[i]] = undefined;.

However, you can make your function more simplified as follows:

function distinctUnion(arr, arr2) {
  let map = {};
  [...arr, ...arr2].forEach((x)=>{map[x] = x});
  
  return Object.values(map);;
}

let arr = [3, 4, 5, 6, 6, 4, 5, 8, 9, 10, 10];
let arr2 = [11, 11, 11, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6];

console.log('Unique ', distinctUnion(arr, arr2));

Upvotes: 0

Unmitigated
Unmitigated

Reputation: 89384

If you do not set the property to anything, map.hasOwnProperty(...) will spuriously return false for the next time that value is encountered, thus allowing duplicates. You don't need to set it to true, as it is just used to indicate the presence of a key; any value is fine—even undefined!

function distinctUnion(arr, arr2) {
  let merged = [...arr, ...arr2];
  var result = [];
  var map = {}
  for (let i = 0; i < merged.length; i++) {
    if (!map.hasOwnProperty(merged[i])) {
      map[merged[i]] = undefined;
      result.push(merged[i]);
    }
  }
  return result;
}

let arr = [3, 4, 5, 6, 6, 4, 5, 8, 9, 10, 10];
let arr2 = [11, 11, 11, 4, 4, 4, 5, 5, 5, 6, 6, 6, 6];
console.log('unique ', JSON.stringify(distinctUnion(arr, arr2), 2, null));

Upvotes: 2

Related Questions