如何删除 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_idapptype_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; }