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

JavaScript:检查对象数组中是否存在重复的键值,并删除除最近添加的具有该键值的对象之外的所有对象,javascript,arrays,object,duplicates,Javascript,Arrays,Object,Duplicates,我试图找出如何检查同一数组中对象之间的键的重复值,然后只保留最近添加的对象具有该值 例如,我有一个对象数组,我试图从中过滤出重复的m_id,如下所示: arr=[ {id:“id-1”,m_id:“1”,颜色:“蓝色”}, {id:“id-2”,m_id:“1”,颜色:“绿色”}, {id:“id-3”,m_id:“2”,颜色:“红色”}, {id:“id-4”,m_id:“2”,颜色:“黄色”}, {id:“id-5”,m_id:“5”,颜色:“紫色”} ] 上述对象示例数组的预期结果为:

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

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

arr=[
{id:“id-1”,m_id:“1”,颜色:“蓝色”},
{id:“id-2”,m_id:“1”,颜色:“绿色”},
{id:“id-3”,m_id:“2”,颜色:“红色”},
{id:“id-4”,m_id:“2”,颜色:“黄色”},
{id:“id-5”,m_id:“5”,颜色:“紫色”}
]
上述对象示例数组的预期结果为:

arr=[
{id:“id-2”,m_id:“1”,颜色:“绿色”},
{id:“id-4”,m_id:“2”,颜色:“黄色”},
{id:“id-5”,m_id:“5”,颜色:“紫色”}
]
如您所见,我有一个简单的
id
字符串值,该值通过设计为集合递增。我要做的是找到数组中任意两个对象之间是否存在重复的
m_id
值,然后删除两个id中较低的对象。在本例中,lower是指字符串id的非数字布尔比较(例如,
boolean(“id-1”<“id-2”)
返回
true


我曾尝试将
Array.prototype.filter()
与多种复杂的排列组合使用,但当我在
filter
中比较同一数组中的对象元素的键值时遇到了麻烦,因为整个集合不在范围内。到目前为止,我无法获得所需的结果。

您可以将其转换为一个由
m\u id
索引的地图,然后获取地图的值:

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

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

通过使用排序数组,您可以使用实际对象检查前置对象,并检查
m_是否不相等

const
数组=[{id:“id-1”,m_id:“1”,颜色:“蓝色”},{id:“id-2”,m_id:“1”,颜色:“绿色”},{id:“id-3”,m_id:“2”,颜色:“红色”},{id:“id-4”,m_id:“2”,颜色:“黄色”},{id:“id-5”,m_id:“5”,颜色:“紫色”},
result=array.filter((b,i,{[i-1]:a})=>a?.m_id!==b.m_id);
控制台日志(结果)

作为控制台包装{max height:100%!important;top:0;}
使用lower是什么意思?这是一个非数字比较。e、 例如,
Boolean(“id-1”<“id-2”)
计算结果为
true
数组是否按
muid
排序?不,不需要排序:-)谢谢。您的第二个示例似乎做了需要做的事情。这是您使用
reduce
内部的复合条件编写的一些非常令人印象深刻的beast模式逻辑。这种方法只需要使用具有相同
m_id
的最后一个对象。谢谢。我明白你的意思,尽管我认为他们的回答基于问题的条件是很好的。我将进一步检查真实代码。@NinaScholz我相信这是原始请求,将数组过滤到每个
muid
的最新(最后一个对象)实例。