我试图找出如何检查同一数组中的对象之间的键的重复值,然后只保留最近添加的对象具有该值。
例如,我有一个对象数组,我试图从其中筛选出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值,然后删除两个ids中较低的对象。在这种情况下,我指的是字符串ids的非数值布尔比较(例如,Boolean("id-1" < "id-2")返回true)。
我曾尝试将Array.prototype.filter()和Array.prototype.some()结合使用在许多棘手的排列中,但当整个集合不在范围内时,当我希望比较Array.prototype.some()中的相同数组中的对象元素的键值时,就会遇到麻烦。到目前为止,我无法得到我需要的结果。
发布于 2021-04-06 17:15:05
您可以将其转换为m_id索引的映射,然后获取映射的值:
const map = new Map(
arr.map(obj => [obj.m_id, obj])
);
const deduplicatedArr = [...map.values()];(您可以在这里使用一个对象,但只有在不需要保留相应的非重复in顺序的情况下,因为这些in是数字的,如果它们是对象的属性,它们将按升序顺序迭代)
发布于 2021-04-06 17:24:55
通过有一个排序的数组,您可以使用实际的对象检查前面的内容,并检查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; }
https://stackoverflow.com/questions/66973346
复制相似问题