У меня есть такой объект:
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 }
]
Как фильтровать без дубликатов, как я ожидал?
Пожалуйста, спросите меня, нужна ли вам дополнительная информация, если ее все еще недостаточно.
Будет ли hashtag всегда иметь только один объект в своем массиве?
Еще нет, я еще не пробовал .filter() @ZainWilson-WCHStudent
да, hashtag всегда будет иметь один объект в массиве @Andy
Предполагая, что в массиве hashtag всегда есть один элемент, я бы подошел к этому с помощью метода Array.reduce. То есть создайте новый массив методом reduce, который организует данные по emp_id, а затем создайте окончательный массив результатов с помощью map, который массирует вывод.
@ user18605090 Вот MDN для .уменьшать()



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В 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 есть только один элемент, если их больше одного (поскольку это массив, это законное предположение), ему потребуются некоторые дополнительные настройки.
@CesarePolonara ОП уже сказал мне, что у hashtag будет только один объект (см. комментарии).
Хорошо, извините, я пропустил это!
Я бы запустил фильтр для объектов, которые у вас есть, прежде чем извлекать информацию! Это должно помочь:
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
Вы можете получить массив объектов и отфильтровать их с помощью 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
Вы пробовали .фильтр()