Как удалить повторяющийся объект в javascript?

У меня есть такой объект:

cons data = []
const result =
[
    {
        "result_id": "AAA877",
        "emp_id": 1,
        "hashtag": [
            {
                "result_id": "AAA877",
                "hashtag_id": 1,
                "apptype_id": 3,
                "tag": {
                    "id": 1,
                    "name": "NodeJs",
                    "hashtag_group_id": 1
                }
            }
        ]
    },
    {
        "result_id": "AAAAA1",
        "emp_id": 1,
        "hashtag": [
            {
                "result_id": "AAAAA1",
                "hashtag_id": 1,
                "apptype_id": 4,
                "tag": {
                    "id": 1,
                    "name": "NodeJs",
                    "hashtag_group_id": 1
                }
            }
        ]
    },
    {
        "result_id": "AAB238",
        "emp_id": 1,
        "hashtag": [
            {
                "result_id": "AAB238",
                "hashtag_id": 2,
                "apptype_id": 4,
                "tag": null
            }
        ]
    },
    {
        "result_id": "AAB415",
        "emp_id": 1,
        "hashtag": [
            {
                "result_id": "AAB415",
                "hashtag_id": 1,
                "apptype_id": 3,
                "tag": {
                    "id": 1,
                    "name": "NodeJs",
                    "hashtag_group_id": 1
                }
            }
        ]
    },
    {
        "result_id": "AAD668",
        "emp_id": 2,
        "hashtag": [
            {
                "result_id": "AAD668",
                "hashtag_id": 1,
                "apptype_id": 3,
                "tag": {
                    "id": 1,
                    "name": "NodeJs",
                    "hashtag_group_id": 1
                }
            }
        ]
    },
    {
        "result_id": "AAG239",
        "emp_id": 1,
        "hashtag": [
            {
                "result_id": "AAG239",
                "hashtag_id": 4,
                "apptype_id": 3,
                "tag": null
            }
        ]
    },
    {
        "result_id": "AAH740",
        "emp_id": 1,
        "hashtag": [
            {
                "result_id": "AAH740",
                "hashtag_id": 2,
                "apptype_id": 3,
                "tag": null
            }
        ]
    },
    {
        "result_id": "AAK119",
        "emp_id": 2,
        "hashtag": [
            {
                "result_id": "AAK119",
                "hashtag_id": 1,
                "apptype_id": 4,
                "tag": {
                    "id": 1,
                    "name": "NodeJs",
                    "hashtag_group_id": 1
                }
            }
        ]
    },
    {
        "result_id": "AAK298",
        "emp_id": 1,
        "hashtag": [
            {
                "result_id": "AAK298",
                "hashtag_id": 2,
                "apptype_id": 3,
                "tag": null
            }
        ]
    }
]

Я хочу отфильтровать и нажать emp_id и apptype_id без дубликатов

Это то, что я ожидал:

[
  { emp_id: 1, app_type_id: 3 },
  { emp_id: 1, app_type_id: 4 },
  { emp_id: 2, app_type_id: 3 },
  { emp_id: 2, app_type_id: 4 }
]

Я пытался так:

result.forEach(r => {
        if (r.hashtag[0].tag !== null) {
          const t = {
            emp_id: r.emp_id,
            app_type_id: r.hashtag[0].apptype_id
          }
          if (data.indexOf(t) === -1) {
            data.push(t)
          }
        }
      })

Но то, что я получил, было так:

[
  { emp_id: 1, app_type_id: 3 },
  { emp_id: 1, app_type_id: 4 },
  { emp_id: 1, app_type_id: 3 },
  { emp_id: 2, app_type_id: 3 },
  { emp_id: 2, app_type_id: 4 }
]

Как фильтровать без дубликатов, как я ожидал?

Пожалуйста, спросите меня, нужна ли вам дополнительная информация, если ее все еще недостаточно.

Вы пробовали .фильтр()

Zain Wilson - WCH Student 13.05.2022 15:46

Будет ли hashtag всегда иметь только один объект в своем массиве?

Andy 13.05.2022 15:46

Еще нет, я еще не пробовал .filter() @ZainWilson-WCHStudent

user18605090 13.05.2022 15:47

да, hashtag всегда будет иметь один объект в массиве @Andy

user18605090 13.05.2022 15:48

Предполагая, что в массиве hashtag всегда есть один элемент, я бы подошел к этому с помощью метода Array.reduce. То есть создайте новый массив методом reduce, который организует данные по emp_id, а затем создайте окончательный массив результатов с помощью map, который массирует вывод.

Bumhan Yu 13.05.2022 15:50

@ user18605090 Вот MDN для .уменьшать()

Zain Wilson - WCH Student 13.05.2022 15:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
56
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

В JS нет сравнения структур, объекты сравниваются по их «адресам в памяти», вам нужно сравнивать примитивные значения ([].indexOf(t) сравнивает элементы массива с t).

console.info({text: 'hey'} !== {text: 'hey'})

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness

Ответ принят как подходящий

Альтернативный подход. Прокрутите данные, разрушать нужные свойства в новый объект, усложнить это, и поместите эту строку во временный массив. Затем на каждой следующей итерации проверяйте, не была ли уже создана эта строка. Если он не вставил эту строку в массив.

Наконец, map над строками и разобрать каждый для создания массива объектов, который соответствует ожидаемому результату.

const data=[{result_id:"AAA877",emp_id:1,hashtag:[{result_id:"AAA877",hashtag_id:1,apptype_id:3,tag:{id:1,name:"NodeJs",hashtag_group_id:1}}]},{result_id:"AAAAA1",emp_id:1,hashtag:[{result_id:"AAAAA1",hashtag_id:1,apptype_id:4,tag:{id:1,name:"NodeJs",hashtag_group_id:1}}]},{result_id:"AAB238",emp_id:1,hashtag:[{result_id:"AAB238",hashtag_id:2,apptype_id:4,tag:null}]},{result_id:"AAB415",emp_id:1,hashtag:[{result_id:"AAB415",hashtag_id:1,apptype_id:3,tag:{id:1,name:"NodeJs",hashtag_group_id:1}}]},{result_id:"AAD668",emp_id:2,hashtag:[{result_id:"AAD668",hashtag_id:1,apptype_id:3,tag:{id:1,name:"NodeJs",hashtag_group_id:1}}]},{result_id:"AAG239",emp_id:1,hashtag:[{result_id:"AAG239",hashtag_id:4,apptype_id:3,tag:null}]},{result_id:"AAH740",emp_id:1,hashtag:[{result_id:"AAH740",hashtag_id:2,apptype_id:3,tag:null}]},{result_id:"AAK119",emp_id:2,hashtag:[{result_id:"AAK119",hashtag_id:1,apptype_id:4,tag:{id:1,name:"NodeJs",hashtag_group_id:1}}]},{result_id:"AAK298",emp_id:1,hashtag:[{result_id:"AAK298",hashtag_id:2,apptype_id:3,tag:null}]}];

const temp = [];

for (const obj of data) {
  const { emp_id, hashtag: [{ apptype_id }] } = obj;
  const newObj = { emp_id, app_type_id: apptype_id };
  const str = JSON.stringify(newObj);
  if (!temp.includes(str)) temp.push(str);
}

const out = temp.map(str => JSON.parse(str));
console.info(out);

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

Cesare Polonara 13.05.2022 16:08

@CesarePolonara ОП уже сказал мне, что у hashtag будет только один объект (см. комментарии).

Andy 13.05.2022 16:09

Хорошо, извините, я пропустил это!

Cesare Polonara 13.05.2022 16:14

Я бы запустил фильтр для объектов, которые у вас есть, прежде чем извлекать информацию! Это должно помочь:

var removed_duplicates = result.filter((result, index, self) =>
    index === self.findIndex((other_entry) => 
        (other_entry.emp_id === result.emp_id && 
         other_entry.hashtag[0].apptype_id === result.hashtag[0].apptype_id)))

Что это делает, так это фильтрует ваши исходные записи, ища другие записи в списке с теми же значениями, которые вы пытаетесь фильтровать. Если их нет, то возвращаемый индекс будет таким же, в противном случае он будет успешным для первой встречи с одной из повторяющихся записей, но не будет работать для всех последующих, что приведет к их удалению.

спасибо за ответ на мой вопрос! :D

user18605090 13.05.2022 16:17

Вы можете получить массив объектов и отфильтровать их с помощью Set.

const
    data = [{ result_id: "AAA877", emp_id: 1, hashtag: [{ result_id: "AAA877", hashtag_id: 1, apptype_id: 3, tag: { id: 1, name: "NodeJs", hashtag_group_id: 1 } }] }, { result_id: "AAAAA1", emp_id: 1, hashtag: [{ result_id: "AAAAA1", hashtag_id: 1, apptype_id: 4, tag: { id: 1, name: "NodeJs", hashtag_group_id: 1 } }] }, { result_id: "AAB238", emp_id: 1, hashtag: [{ result_id: "AAB238", hashtag_id: 2, apptype_id: 4, tag: null }] }, { result_id: "AAB415", emp_id: 1, hashtag: [{ result_id: "AAB415", hashtag_id: 1, apptype_id: 3, tag: { id: 1, name: "NodeJs", hashtag_group_id: 1 } }] }, { result_id: "AAD668", emp_id: 2, hashtag: [{ result_id: "AAD668", hashtag_id: 1, apptype_id: 3, tag: { id: 1, name: "NodeJs", hashtag_group_id: 1 } }] }, { result_id: "AAG239", emp_id: 1, hashtag: [{ result_id: "AAG239", hashtag_id: 4, apptype_id: 3, tag: null }] }, { result_id: "AAH740", emp_id: 1, hashtag: [{ result_id: "AAH740", hashtag_id: 2, apptype_id: 3, tag: null }] }, { result_id: "AAK119", emp_id: 2, hashtag: [{ result_id: "AAK119", hashtag_id: 1, apptype_id: 4, tag: { id: 1, name: "NodeJs", hashtag_group_id: 1 } }] }, { result_id: "AAK298", emp_id: 1, hashtag: [{ result_id: "AAK298", hashtag_id: 2, apptype_id: 3, tag: null }] }],
    result = data
        .flatMap(({ emp_id, hashtag }) => hashtag.map(({ apptype_id }) => ({ emp_id, apptype_id })))
        .filter((s => ({ emp_id, apptype_id }) => {
            const key = [emp_id, apptype_id].join('|');
            if (!s.has(key)) return s.add(key);
        })(new Set));

console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

спасибо за ответ на мой вопрос! :D

user18605090 13.05.2022 16:17

Другие вопросы по теме