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

Posted

技术标签:

【中文标题】JavaScript:检查对象数组中是不是存在重复的键值并删除所有但最近添加的具有该键值的对象【英文标题】:JavaScript: check if duplicate key values exist in array of objects and remove all but most recently added object having that key valueJavaScript:检查对象数组中是否存在重复的键值并删除所有但最近添加的具有该键值的对象 【发布时间】:2021-07-02 12:21:12 【问题描述】:

我正在尝试弄清楚如何检查同一数组中对象之间键的重复值,然后只保留最近添加的具有该值的对象。

例如,我有一个对象数组,我试图从中过滤出 m_id 的重复项,如下所示:

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"
]

上述示例对象数组的期望结果是:

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 值,然后删除具有两个ID 的lower 的对象。在这种情况下,较低的意思是字符串 id 的非数字布尔比较(例如,Boolean("id-1" < "id-2") 返回true)。

我已经尝试在许多挣扎的排列中将Array.prototype.filter()Array.prototype.some() 结合使用,但是当我想要比较对象元素的键值时,我总是遇到麻烦相同当整个集合不在范围内时,我的filter 中的数组。到目前为止,我无法获得所需的结果。

【问题讨论】:

你说的lower是什么意思? 这是一个非数字比较。例如,Boolean("id-1" < "id-2") 计算结果为 true 数组是按m_id排序的吗? 不,不需要排序:-) 【参考方案1】:

你可以把它变成一个由m_id索引的地图,然后取地图的值:

const map = new Map(
  arr.map(obj => [obj.m_id, obj])
);
const deduplicatedArr = [...map.values()];

(您可能可以在此处使用对象,但前提是不需要保留非重复 ID 的相应顺序 - 因为 ID 是数字,它们将是如果它们是对象的属性,则按数字升序迭代)

【讨论】:

这种方法只取最后一个具有相同m_id的对象。 谢谢。像你一样被接受。 @NinaScholz,我明白你的意思,尽管我认为根据问题的条款,他们的反应很好。我会进一步检查实际代码。 @NinaScholz 我相信这是原始请求,将数组过滤到每个 m_id 的最新(最后一个对象)实例。【参考方案2】:

通过排序数组,您可以检查前任与实际对象并检查m_is 是否不相等。

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);
.as-console-wrapper  max-height: 100% !important; top: 0; 

对于未排序的数组,您也可以检查id

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);
.as-console-wrapper  max-height: 100% !important; top: 0; 

【讨论】:

谢谢。您的第二个示例似乎可以满足需要。这是您使用reduce 中的复合条件编写的一些非常令人印象深刻的野兽模式逻辑?

以上是关于JavaScript:检查对象数组中是不是存在重复的键值并删除所有但最近添加的具有该键值的对象的主要内容,如果未能解决你的问题,请参考以下文章

检查未知对象中的对象是不是存在的最有效的Javascript方法[重复]

检查对象值是不是存在于 Javascript 对象数组中,如果不存在则将新对象添加到数组

如何检查 Javascript 中是不是存在字符串/数组/对象? [复制]

Jquery,检查数组中是不是存在值[重复]

Javascript:检查对象是不是没有属性或映射/关联数组是不是为空[重复]

检查数组中是不是存在迭代器时,array.includes 不起作用[重复]