-3

I am having two objects i would like to compare those objects and remove the duplicate objects by value and show the rest of the objects.I have tried lodash omit but it doesn't works.

    let users = [
  {value: "6qcuXSLWAnVospWkugWa", label: "Karthi"},
  {value: "Qk8pc08WmcacM7BqFxow", label: "Karthi"},
  {value: "evLkHAkhNZ9qqeYc1tDn", label: "Sankar"},
  {value: "WE6kIW8sGkEuMRXQgQPT", label: "User8"},
  {value: "km2jHXDQgPXdBY4jq6dG", label: "User50"},
  {value: "ObQhbfH3YroudLVz5YkY", label: "User10"}
]

let selectedUsers = [
{value: "6qcuXSLWAnVospWkugWa", label: "Karthi"},
{value: "Qk8pc08WmcacM7BqFxow", label: "Karthi"},
{value: "evLkHAkhNZ9qqeYc1tDn", label: "Sankar"},
{value: "WE6kIW8sGkEuMRXQgQPT", label: "User8"},
{value: "km2jHXDQgPXdBY4jq6dG", label: "User50"},
{value: "ObQhbfH3YroudLVz5YkY", label: "User10"},
{value: "L9FW5oXDlDmzhWxhGEdu", label: "Govind"}
]

Without using multiple loops is it possible to remove the duplicates

Nidhin Kumar
  • 3,278
  • 9
  • 40
  • 72

5 Answers5

1
var userObjectOfObjects = users.reduce(
        (acc, o) => {
            acc[o.value] = o;
            return acc;
        }, {} )

var selectUsersObject = selectedUsers.reduce(
    (acc, o) => {
        if(userObjectOfObjects[o.value]){
            acc.duplicates.push(o)
            return acc;
        }
        else {
            acc.objectWithoutDuplicates.push(o)
        }
        acc.uniqueList[o.value] = o;
        return acc;
    }, { uniqueList: {}, objectWithoutDuplicates:[], duplicates: [] } )


selectUsersObject.uniqueList = {
    ...selectUsersObject.uniqueList,
    ...userObjectOfObjects
}

var uniqueList = Object.values(selectUsersObject.uniqueList)
var duplicates = selectUsersObject.duplicates
var noRepetition = selectUsersObject.objectWithoutDuplicates
Alfred Ayi-bonte
  • 715
  • 7
  • 11
0

let result = _.unionBy(users, selectedUsers, 'value');

Alfred Ayi-bonte
  • 715
  • 7
  • 11
0

You can use differenceWith and isEqual to get the unique value from the selectedUsers.

let users = [{value: "6qcuXSLWAnVospWkugWa", label: "Karthi"}, {value: "Qk8pc08WmcacM7BqFxow", label: "Karthi"}, {value: "evLkHAkhNZ9qqeYc1tDn", label: "Sankar"}, {value: "WE6kIW8sGkEuMRXQgQPT", label: "User8"}, {value: "km2jHXDQgPXdBY4jq6dG", label:
"User50"}, {value: "ObQhbfH3YroudLVz5YkY", label: "User10"}],
    selectedUsers = [{value: "6qcuXSLWAnVospWkugWa", label: "Karthi"}, {value: "Qk8pc08WmcacM7BqFxow", label: "Karthi"}, {value: "evLkHAkhNZ9qqeYc1tDn", label: "Sankar"}, {value: "WE6kIW8sGkEuMRXQgQPT",
label: "User8"}, {value: "km2jHXDQgPXdBY4jq6dG", label: "User50"}, {value: "ObQhbfH3YroudLVz5YkY", label: "User10"}, {value: "L9FW5oXDlDmzhWxhGEdu", label: "Govind"}],
    result = _.differenceWith(selectedUsers, users, _.isEqual);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
Hassan Imam
  • 21,956
  • 5
  • 41
  • 51
0

Any solution to this would require multiple loops. It's either you write multiple loops or the shorthand code you write uses multiple loops internally.

This one-liner should work for you

const arrWithoutDup = selectedUsers.filter(sUser => users.filter(user => sUser.value === user.value && sUser.value === user.value).length === 0);
Dinesh Pandiyan
  • 5,814
  • 2
  • 30
  • 49
0

Assuming for objects to duplicate, value and label values should be same.

You can try following using simple Javascript with linear complexity. Firstly, convert users array into an object and then using Array.filter on second array, filter out the duplicate objects.

let users = [{value: "6qcuXSLWAnVospWkugWa", label: "Karthi"},{value: "Qk8pc08WmcacM7BqFxow", label: "Karthi"},{value: "evLkHAkhNZ9qqeYc1tDn", label: "Sankar"},{value: "WE6kIW8sGkEuMRXQgQPT", label: "User8"},{value: "km2jHXDQgPXdBY4jq6dG", label: "User50"},{value: "ObQhbfH3YroudLVz5YkY", label: "User10"}];
let selectedUsers = [{value: "6qcuXSLWAnVospWkugWa", label: "Karthi"},{value: "Qk8pc08WmcacM7BqFxow", label: "Karthi"},{value: "evLkHAkhNZ9qqeYc1tDn", label: "Sankar"},{value: "WE6kIW8sGkEuMRXQgQPT", label: "User8"},{value: "km2jHXDQgPXdBY4jq6dG", label: "User50"},{value: "ObQhbfH3YroudLVz5YkY", label: "User10"},{value: "L9FW5oXDlDmzhWxhGEdu", label: "Govind"}];

let uersObj = users.reduce((a,c) => Object.assign(a, {[c.value]:c.label}), {});
let result = selectedUsers.filter(v => !uersObj[v.value] || uersObj[v.value] !== v.label);
console.log(result);
Nikhil Aggarwal
  • 28,197
  • 4
  • 43
  • 59