【问题标题】:How to compare two objects and remove the duplicate objects by value in javascript如何比较两个对象并在javascript中按值删除重复的对象
【发布时间】:2018-10-29 07:39:35
【问题描述】:

我有两个对象,我想比较这些对象并按值删除重复的对象并显示其余对象。我尝试了 lodash omit 但它不起作用。

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

不使用多个循环是否可以删除重复项

【问题讨论】:

标签: javascript reactjs lodash


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • @MatthieuBrucher 它本质上是按值返回唯一对象。
    • @MatthieuBrucher 我认为这是不言自明的。
    【解决方案3】:

    您可以使用differenceWithisEqualselectedUsers 中获取唯一值。

    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>

    【讨论】:

      【解决方案4】:

      假设要复制的对象,valuelabel 的值应该相同。

      您可以尝试使用具有线性复杂度的简单 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);

      【讨论】:

        【解决方案5】:

        对此的任何解决方案都需要多个循环。要么你写了多个循环,要么你写的速记代码在内部使用了多个循环。

        这个单线应该适合你

        const arrWithoutDup = selectedUsers.filter(sUser => users.filter(user => sUser.value === user.value && sUser.value === user.value).length === 0);
        

        【讨论】:

          猜你喜欢
          • 2020-10-16
          • 2020-05-08
          • 2021-05-09
          • 2020-05-11
          • 2017-06-01
          • 2015-05-05
          • 2023-03-24
          • 1970-01-01
          • 2023-03-15
          相关资源
          最近更新 更多