首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript:检查对象数组中是否存在重复的键值,并删除除最近添加的所有具有该键值的对象

JavaScript:检查对象数组中是否存在重复的键值,并删除除最近添加的所有具有该键值的对象
EN

Stack Overflow用户
提问于 2021-04-06 17:12:53
回答 2查看 3.1K关注 0票数 0

我试图找出如何检查同一数组中的对象之间的键的重复值,然后只保留最近添加的对象具有该值。

例如,我有一个对象数组,我试图从其中筛选出m_id的副本,如下所示:

代码语言:javascript
复制
arr = [
  {id: "id-1", m_id: "1", color: "blue"},
  {id: "id-2", m_id: "1", color: "green"},
  {id: "id-3", m_id: "2", color: "red"},
  {id: "id-4", m_id: "2", color: "yellow"},
  {id: "id-5", m_id: "5", color: "purple"}
]

上面示例对象数组的预期结果是:

代码语言:javascript
复制
arr = [
  {id: "id-2", m_id: "1", color: "green"},
  {id: "id-4", m_id: "2", color: "yellow"},
  {id: "id-5", m_id: "5", color: "purple"}
]

如您所见,我有一个简单的id字符串值,通过设计对集合进行增量。我要做的是找出数组中任何两个对象之间是否存在一个重复的m_id值,然后删除两个ids中较低的对象。在这种情况下,我指的是字符串ids的非数值布尔比较(例如,Boolean("id-1" < "id-2")返回true)。

我曾尝试将Array.prototype.filter()Array.prototype.some()结合使用在许多棘手的排列中,但当整个集合不在范围内时,当我希望比较Array.prototype.some()中的相同数组中的对象元素的键值时,就会遇到麻烦。到目前为止,我无法得到我需要的结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-06 17:15:05

您可以将其转换为m_id索引的映射,然后获取映射的值:

代码语言:javascript
复制
const map = new Map(
  arr.map(obj => [obj.m_id, obj])
);
const deduplicatedArr = [...map.values()];

(您可以在这里使用一个对象,但只有在不需要保留相应的非重复in顺序的情况下,因为这些in是数字的,如果它们是对象的属性,它们将按升序顺序迭代)

票数 2
EN

Stack Overflow用户

发布于 2021-04-06 17:24:55

通过有一个排序的数组,您可以使用实际的对象检查前面的内容,并检查m_is是否相等。

代码语言:javascript
复制
const
    array = [{ id: "id-1", m_id: "1", color: "blue" }, { id: "id-2", m_id: "1", color: "green" }, { id: "id-3", m_id: "2", color: "red" }, { id: "id-4", m_id: "2", color: "yellow" }, { id: "id-5", m_id: "5", color: "purple" }],
    result = array.filter((b, i, { [i - 1]: a }) => a?.m_id !== b.m_id);

console.log(result);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

使用未排序的数组,您也可以检查id

代码语言:javascript
复制
const
    array = [{ id: "id-1", m_id: "1", color: "blue" }, { id: "id-2", m_id: "1", color: "green" }, { id: "id-3", m_id: "2", color: "red" }, { id: "id-4", m_id: "2", color: "yellow" }, { id: "id-5", m_id: "5", color: "purple" }],
    result = Object.values(array.reduce((r, o) => {
        if (!r[o.m_id] || +r[o.m_id].id.split('-')[1] < +o.id.split('-')[1]) r[o.m_id] = o;
        return r;
    }, {}));

console.log(result);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66973346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档