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

标签 javascript arrays filter duplicates javascript-objects

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

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

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;
},[]);

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

最佳答案

将数组缩减为以user 为键的对象。如果用户不在 unique 对象中,或者如果它的日期比实际情况“更早”,则将其添加到对象中。使用 Object.values() 将对象转换为数组.

注意:因为您的日期是字符串,所以在比较时将它们转换为数字(我使用 + operator )。

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);

关于javascript - JS - 过滤一个对象数组以查找一个属性的重复项,并根据另一个属性决定保留哪个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53042292/

相关文章:

javascript - 如何在 JavaScript 中接受未签名的证书

javascript - setValues 不适用于 Google Apps 脚本中的数组

google-sheets - Google 表格查询函数 : Select Columns by Name

javascript - 使用 jQuery 一键单击多个可编辑字段

javascript - React Native 适配文本组件

javascript - 来自 URL 的正则表达式匹配数据在有两个匹配项时仅返回 1 个匹配项

filter - 传单.js : is it possible to filter geoJSON features by property?

R - 从数据框中过滤数据

javascript - Webpack 2 sourcemaps 不生成

javascript - 如何将同一属性上的数组和对象 "merge/concat"转换为平面数组(使用 Javascript)?