Javascript JS-过滤对象数组中某个属性的重复项,并根据另一个属性决定保留哪个对象

Javascript JS-过滤对象数组中某个属性的重复项,并根据另一个属性决定保留哪个对象,javascript,arrays,filter,duplicates,javascript-objects,Javascript,Arrays,Filter,Duplicates,Javascript Objects,尝试通过删除具有已存在于另一个对象(重复)中的特定属性的对象来筛选对象数组。删除哪个对象的决定应基于另一个属性 const arr = [ {user: 'Alex', date: '1540801929945'}, {user: 'Bill', date: '1640801929946'}, {user: 'Carl', date: '1740801929947'}, {user: 'Alex', date: '1840801929948'}, ] 例如: 对

尝试通过删除具有已存在于另一个对象(重复)中的特定属性的对象来筛选对象数组。删除哪个对象的决定应基于另一个属性

const arr = [
    {user: 'Alex', date: '1540801929945'},
    {user: 'Bill', date: '1640801929946'},
    {user: 'Carl', date: '1740801929947'},
    {user: 'Alex', date: '1840801929948'},
]
例如: 对于一个对象数组(看起来可能是这样的),目标是过滤所有“用户”重复项,并保留具有最早“日期”属性的重复项

const arr = [
    {user: 'Alex', date: '1540801929945'},
    {user: 'Bill', date: '1640801929946'},
    {user: 'Carl', date: '1740801929947'},
    {user: 'Alex', date: '1840801929948'},
]
预期成果:

filteredArr = [
    {user: 'Alex', date: '1540801929945'},
    {user: 'Bill', date: '1640801929946'},
    {user: 'Carl', date: '1740801929947'},
]
我管理的基本过滤只保留唯一的对象

const filteredArr = arr.reduce((unique, o) => {
    if(!unique.some(obj => obj.user === o.user) {
      unique.push(o);
    }
    return unique;
},[]);
虽然我不知道该怎么做,在重复的情况下,“最旧的”对象保持不变,最新的对象被删除。
非常感谢你的帮助!非常感谢。

将数组缩小为以
用户
为键的对象。如果用户不在
unique
对象中,或者其日期比实际日期“早”,则将其添加到对象中。使用将对象转换为数组

注意:由于日期是字符串,请在比较时将其转换为数字(我使用的是数字)

const数组=[{user:'Alex',date:'1540801929945'},{user:'Bill',date:'1640801929946'},{user:'Carl',date:'1740801929947'},{user:'Alex',date:'1840801929948'}];
const filteredArray=Object.values(array.reduce)(唯一,o)=>{
如果(!unique[o.user]|+o.date>+unique[o.user].date)unique[o.user]=o;
返回唯一值;
}, {}));
控制台日志(filteredArray)一个采用单循环方法的解决方案

var数组=[{user:'Alex',date:'1540801929945'},{user:'Bill',date:'1640801929946'},{user:'Carl',date:'1740801929947'},{user:'Alex',date:'1840801929948'},
过滤=数组。从(数组)
.reduce((m,o)=>!m.has(o.user)| | m.get(o.user)。数据>o.date
?m.set(o.user,o)
:m,新地图)
.values());
console.log(过滤)
.as console wrapper{max height:100%!important;top:0;}
对于
O(N)
解决方案,
减少为
user
索引的对象,其值为
date
s-在每次迭代中,如果
user
已经存在某个对象,则只保留最低的
date
。然后,迭代对象的
条目
,将其转换回数组:

const arr=[
{用户:'Alex',日期:'1540801929945'},
{用户:'Bill',日期:'1640801929946'},
{用户:'Carl',日期:'1740801929947'},
{用户:'Alex',日期:'1840801929948'},
{用户:'Carl',日期:'1340801929947'},
];
const arrByUser=arr.reduce((a,{user,date})=>{
如果(!a[用户])a[用户]=日期;
如果(a[user].localeCompare(date)==1)a[user]=date;
返回a;
}, {});
const output=Object.entries(arrByUser)
.map(([user,date])=>({user,date}));

控制台日志(输出)我认为您实际上需要知道非唯一元素的索引(在您的例子中是名为“Alex”的对象),然后比较它们的日期,保存旧的日期

Array.prototype.find在这种情况下对你没有好处。 但是,Array.prototype.find可能会有所帮助,因为它接受一个返回布尔值(就像“some”)的回调,但它返回与回调匹配的元素的索引,如果找不到这样的元素,则返回未定义的索引


试试看,不会有什么坏处:)

您的数据是按日期排序的吗?不,很遗憾不是。在实际使用中,对象要大得多,并且根据使用的位置以不同的方式排序……您是否只有给定的两个或更多属性?是否要保留这些对象?是的,还有更多属性。不打算保留这些对象。我猜它是(…)
+o.date<+unique[o.user].date)
(…)——但除此之外,它似乎可以工作。非常感谢你的帮助@我不确定你的评论指的是什么。您的对象包括
date
,而不是
dateofpost