【问题标题】:How to compare object array inside object array and remove duplicate object in Javascript?如何比较对象数组中的对象数组并删除Javascript中的重复对象?
【发布时间】:2020-05-11 02:47:15
【问题描述】:

我有一个对象数组的对象数组。 我想删除对象数组的对象数组中的重复对象。

var arr = {

 "departsObj": {

"departments": [
  {
    "department": [
      {
        "groupID": "21",
        "groupName": "group21",
        "requestDate": "2020-01-24",           
      },
      {
        "groupID": "28",
        "groupName": "group28",
        "requestDate": "2020-01-24",            
      }
    ] 
  },
  {
    "department": [
      {
        "groupID": "28",
        "groupName": "group28",
        "requestDate": "2020-01-24",
      },
      {
        "groupID": "20",
        "groupName": "group20",
        "requestDate": "2020-01-24",
      },
      {
        "groupID": "30",
        "groupName": "group30",
        "requestDate": "2020-01-24",
      }
    ] 
  }
]
 }
 }

我需要返回数组:

{
  "departsObj": {

"departments": [
  {
    "department": [
      {
        "groupID": "21",
        "groupName": "group21",
        "requestDate": "2020-01-24",           
      },
      {
        "groupID": "28",
        "groupName": "group28",
        "requestDate": "2020-01-24",            
      }
    ] 
  },
  {
    "department": [ 
      {
        "groupID": "20",
        "groupName": "group20",
        "requestDate": "2020-01-24",
      },
      {
        "groupID": "30",
        "groupName": "group30",
        "requestDate": "2020-01-24",
      }
    ] 
  }
]
 }
  }

我试过了:

const arr = departsObj.departments;

var result = arr.reduce((unique, o) => {
if(!unique.some(obj => obj.department === o.department)) {
  unique.push(o);
}
return unique;
},[]);

return result;

但我仍然返回重复的对象。 我正在努力从数组对象的对象数组中返回值。

任何帮助将不胜感激。

提前致谢。

【问题讨论】:

    标签: javascript arrays object duplicates


    【解决方案1】:

    您的代码不起作用的原因之一是您无法使用简单的数组比较来确定您的数组是否包含重复值(此外,您正在将一个对象缩减为一个数组,即使您的预期输出是一个对象)。

    您可以使用Set 来跟踪已经看到的每个groupID,以便对嵌套对象中的数组进行重复数据删除。

    const obj = { departsObj: { departments: [{ department: [{ groupID: "21", groupName: "group21", requestDate: "2020-01-24" }, { groupID: "28", groupName: "group28", requestDate: "2020-01-24" } ] }, { department: [{ groupID: "28", groupName: "group28", requestDate: "2020-01-24" }, { groupID: "20", groupName: "group20", requestDate: "2020-01-24" }, { groupID: "30", groupName: "group30", requestDate: "2020-01-24" }] }] } };
    const seen = new Set();
    obj.departsObj.departments = obj.departsObj.departments.filter((d) => {
      d.department = d.department.filter((g) => {
        if (!seen.has(g.groupID)) {
          seen.add(g.groupID);
          return true;
        }
      
        return false;
      });
      
      if (d.department.length) {
        return true;
      }
      
      return false;
    });
    
    console.log(obj);
    // {"departsObj":{"departments":[{"department":[{"groupID":"21","groupName":"group21","requestDate":"2020-01-24"},{"groupID":"28","groupName":"group28","requestDate":"2020-01-24"}]},{"department":[{"groupID":"20","groupName":"group20","requestDate":"2020-01-24"},{"groupID":"30","groupName":"group30","requestDate":"2020-01-24"}]}]}}

    【讨论】:

      【解决方案2】:

      您可以维护访问组的字典,同时遍历每个部门组。这样您就可以轻松识别重复项并将其从数组中删除。这里我使用slice() 复制了部门数组,因为我们正在修改循环内的原始数组。

      const arr = {
        "departsObj": {
          "departments": [{
              "department": [{
                  "groupID": "21",
                  "groupName": "group21",
                  "requestDate": "2020-01-24",
                },
                {
                  "groupID": "28",
                  "groupName": "group28",
                  "requestDate": "2020-01-24",
                }
              ]
            },
            {
              "department": [{
                  "groupID": "28",
                  "groupName": "group28",
                  "requestDate": "2020-01-24",
                },
                {
                  "groupID": "20",
                  "groupName": "group20",
                  "requestDate": "2020-01-24",
                },
                {
                  "groupID": "30",
                  "groupName": "group30",
                  "requestDate": "2020-01-24",
                }
              ]
            }
          ]
        }
      };
      
      const {
        departments
      } = arr.departsObj;
      
      
      // to persist the list of group visited while looping
      const visited = {};
      
      departments.forEach(({
        department
      }) => {
        // make a copy, since we are modifying the original array inside the loop
        department.slice().forEach((group) => {
          // if group is visited already, remove it
          if (visited[group.groupID]) {
            const index = department.indexOf(group);
            department.splice(index, 1);
          } else {
            // mark the group as visited
            visited[group.groupID] = 1;
          }
        });
      });
      
      console.log(arr);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-15
        • 2017-06-01
        • 2020-05-08
        • 2021-05-09
        • 2018-08-15
        • 1970-01-01
        • 2021-06-19
        • 1970-01-01
        相关资源
        最近更新 更多