如何删除 javascript 中的重复对象?
How to remove duplicate object in 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 }
]
如何像我预期的那样在不重复的情况下进行过滤?
如果还不够,请问我是否需要更多信息
JS中没有结构比较,对象是通过它们的“内存中的地址”进行比较的,你必须比较原始值([].indexOf(t)
将数组项与t
进行比较)。
console.log({text: 'hey'} !== {text: 'hey'})
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness
另一种方法。循环数据 destructure the properties you want into a new object, stringify that,并将该字符串推入一个临时数组。然后,在每次下一次迭代中,检查该字符串是否已创建。如果它没有将该字符串推入数组。
最后 map
over the strings and parse each one 生成一个与预期输出匹配的对象数组。
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.log(out);
我会 运行 在提取信息之前对您拥有的对象进行过滤!这应该可以解决问题:
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)))
它的作用是通过在列表中查找与您尝试过滤的值相同的其他条目来过滤您的原始条目。如果有 none,那么返回的索引将是相同的,否则它会在第一次遇到一个重复条目时成功,但对于以下所有条目都失败,导致它们被删除。
您可以获得对象数组并使用 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.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
我有这样的对象:
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 }
]
如何像我预期的那样在不重复的情况下进行过滤?
如果还不够,请问我是否需要更多信息
JS中没有结构比较,对象是通过它们的“内存中的地址”进行比较的,你必须比较原始值([].indexOf(t)
将数组项与t
进行比较)。
console.log({text: 'hey'} !== {text: 'hey'})
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness
另一种方法。循环数据 destructure the properties you want into a new object, stringify that,并将该字符串推入一个临时数组。然后,在每次下一次迭代中,检查该字符串是否已创建。如果它没有将该字符串推入数组。
最后 map
over the strings and parse each one 生成一个与预期输出匹配的对象数组。
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.log(out);
我会 运行 在提取信息之前对您拥有的对象进行过滤!这应该可以解决问题:
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)))
它的作用是通过在列表中查找与您尝试过滤的值相同的其他条目来过滤您的原始条目。如果有 none,那么返回的索引将是相同的,否则它会在第一次遇到一个重复条目时成功,但对于以下所有条目都失败,导致它们被删除。
您可以获得对象数组并使用 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.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }