Как сравнить два объекта и удалить дубликаты объектов по значению в JavaScript - PullRequest
0 голосов
/ 29 октября 2018

У меня есть два объекта, я хотел бы сравнить эти объекты и удалить дубликаты объектов по значению и показать остальные объекты. Я попытался lodash пропустить, но это не работает.

    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"}
]

Без использования нескольких циклов можно удалить дубликаты

Ответы [ 5 ]

0 голосов
/ 29 октября 2018
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
0 голосов
/ 29 октября 2018

Если предположить, что объекты дублируются, значения value и label должны совпадать.

Вы можете попробовать следовать, используя простой Javascript с линейной сложностью. Сначала преобразуйте массив users в объект, а затем, используя Array.filter во втором массиве, отфильтруйте дублирующиеся объекты.

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);
0 голосов
/ 29 октября 2018

Вы можете использовать differenceWith и isEqual, чтобы получить уникальное значение из 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>
0 голосов
/ 29 октября 2018

Любое решение этой проблемы потребует нескольких циклов. Либо вы пишете несколько циклов, либо сокращенный код, который вы пишете, использует несколько циклов внутри.

Этот однострочник должен работать на вас

const arrWithoutDup = selectedUsers.filter(sUser => users.filter(user => sUser.value === user.value && sUser.value === user.value).length === 0);
0 голосов
/ 29 октября 2018

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

...