JS-过滤对象数组以查找一个属性的重复项,并根据另一个属性确定要保留的对象

Yvo*_*onC 3 javascript arrays filter duplicates javascript-objects

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

示例:对于一组看起来像这样的对象,目标是过滤所有“用户”重复项,并保留具有最旧“日期”属性的对象。

const arr = [
    {user: 'Alex', date: '1540801929945'},
    {user: 'Bill', date: '1640801929946'},
    {user: 'Carl', date: '1740801929947'},
    {user: 'Alex', date: '1840801929948'},
]
Run Code Online (Sandbox Code Playgroud)

预期结果:

filteredArr = [
    {user: 'Alex', date: '1540801929945'},
    {user: 'Bill', date: '1640801929946'},
    {user: 'Carl', date: '1740801929947'},
]
Run Code Online (Sandbox Code Playgroud)

我管理了仅用于保留唯一对象的基本过滤。

const filteredArr = arr.reduce((unique, o) => {
    if(!unique.some(obj => obj.user === o.user) {
      unique.push(o);
    }
    return unique;
},[]);
Run Code Online (Sandbox Code Playgroud)

尽管我不知道,该怎么做,以便在重复的情况下保留“最旧的”对象,并删除最新的对象。非常感谢你的帮助!非常感谢。

Ori*_*ori 5

使用user键为键将数组简化为一个对象。如果用户不在unique对象中,或者用户的日期早于对象的日期,则将其添加到对象中。使用将该对象转换为数组Object.values()

注意:由于日期是字符串,因此在比较时将它们转换为数字(我使用+运算符)。

const array = [{ user: 'Alex', date: '1540801929945' }, { user: 'Bill', date: '1640801929946' }, { user: 'Carl', date: '1740801929947' }, { user: 'Alex', date: '1840801929948' }];


const filteredArray = Object.values(array.reduce((unique, o) => {
  if(!unique[o.user] || +o.date > +unique[o.user].date) unique[o.user] = o;
  
  return unique;
}, {}));

console.log(filteredArray);
Run Code Online (Sandbox Code Playgroud)