Как сравнить массив объектов внутри массива объектов и удалить дубликат объекта в Javascript? - PullRequest
0 голосов
/ 24 января 2020

У меня есть массив объектов массива в объекте. Я хотел бы удалить дубликаты объектов внутри массива объектов массива объектов.

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;

Но я все еще возвращаю дубликаты объектов. Я пытаюсь вернуть значение из массива объектов из объектов массива.

Буду признателен за любую помощь.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 24 января 2020

Одна из причин, по которой ваш код не работает, заключается в том, что вы не можете использовать простое сравнение массивов, чтобы определить, содержат ли ваши массивы дублирующиеся значения (кроме того, вы уменьшаете объект до массива, даже если ожидаемый результат является объектом).

Вы можете использовать Set для отслеживания каждого groupID, который уже был замечен, для дедупликации массивов во вложенном объекте.

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

let 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 g;
    }
  
  });
  
  if (d.department.length) {
    return d;
  }
  
});

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"}]}]}}
1 голос
/ 24 января 2020

Вы можете вести словарь посещаемой группы, просматривая каждую группу отделов. так что вы можете легко определить дубликат и удалить его из массива. Здесь я использовал slice(), чтобы сделать копию массива отдела, так как мы модифицируем исходный массив внутри l oop.

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...