我正在try 删除内容和作者相同但时间戳略有不同(即1秒内)的JSON对象array.我想将重复消息保留为一个新字段,称为重复.例如,考虑以下内容,其中条目2、3和5为应消除重复的消息:

myObject = [
{content: 'content1', date: '1980-08-01 12:12:40.000', author: 'Person1'}, 
{content: 'content2', date: '1980-08-01 12:12:40.900', author: 'Person2'},
{content: 'content2', date: '1980-08-01 12:12:41.100', author: 'Person2'},
{content: 'content3', date: '1980-08-01 12:12:41.000', author: 'Person1'},
{content: 'content2', date: '1980-08-01 12:12:41.400', author: 'Person2'},
{content: 'content4', date: '1980-08-01 12:12:45.100', author: 'Person2'},
]

应转换为:

deduped = [
{content: 'content1', date: '1980-08-01 12:12:40.000', author: 'Person1', duplicates: 0}, 
{content: 'content2', date: '1980-08-01 12:12:40.900', author: 'Person2', duplicates: 2},
{content: 'content3', date: '1980-08-01 12:12:41.000', author: 'Person1', duplicates: 0},
{content: 'content4', date: '1980-08-01 12:12:45.100', author: 'Person2', duplicates: 0},
]

我遇到的问题是日期时间.如果重复消息之间出现非重复消息,则按日期时间排序然后减少很容易出错.比较datetimes的字符串值也容易出错,因为两条消息可能非常接近,但根据它们落下的位置显示为1秒.

使用lodash _.uniqWith,我可以基于具有相同内容和作者的实际时间增量的组合进行重复数据消除,但我缺少duplicates字段...

const dedupedButNoCount = _.uniqWith(myObject, (item1, item2) => 
{return (item1.content== item2.content) && (item1.author== item2.author) 
&& ((new Date(item1.date).getTime() - new Date(item2.date).getTime())<500)}
)

关于如何消除具有相似但不相同日期时间的对象数组的重复数据,有什么建议吗?

推荐答案

我已经做到了,但我使用了排序...

const
  getTimeMs = YMDhmsx =>     // date string conversion to UTC (time zone = 0)
    {
    let [Y,M,D,h,m,s,x] = YMDhmsx.split(/\-|\.|\s|\:/).map(Number)
    return (new Date(Date.UTC(Y,--M,D,h,m,s,x))).getTime() // time UTC value in ms
    }
, myObject = [
    {content: 'content1', date: '1980-08-01 12:12:40.000', author: 'Person1'}, 
    {content: 'content2', date: '1980-08-01 12:12:40.900', author: 'Person2'},
    {content: 'content2', date: '1980-08-01 12:12:41.100', author: 'Person2'},
    {content: 'content3', date: '1980-08-01 12:12:41.000', author: 'Person1'},
    {content: 'content2', date: '1980-08-01 12:12:41.400', author: 'Person2'},
    {content: 'content4', date: '1980-08-01 12:12:45.100', author: 'Person2'},
    ]
    
let result = 
  myObject
  .sort( (a,b) =>
    a.content.localeCompare(b.content) || 
    a.author.localeCompare(b.author) || 
    a.date.localeCompare(b.date) 
    )
  .reduce( (r,el,i,{[i-1]:prev}) =>
    {
    let msTime = getTimeMs(el.date)

    if (el.content === prev?.content 
     && el.author === prev?.author
     && (msTime - r.msTime) <= 1000 )  // 1 second less on previous
      r.current.duplicates++;
    else
      {
      r.current = {...el, duplicates:0 }
      r.result.push( r.current )
      }
    r.msTime = msTime
    return r
    }
    , {msTime:0, current:null, result:[] })
  .result;
  
console.log ( 'result:\n' + JSON.stringify( result ).replaceAll('},{','}\n,{') ) 
.as-console-wrapper {max-height: 100% !important;top: 0;}
.as-console-row::after {display: none !important;}

Javascript相关问答推荐

将json数组项转换为js中的扁平

Phaser框架-将子对象附加到Actor

Cookie中未保存会话数据

JQuery. show()工作,但. hide()不工作

如何在angular中从JSON值添加动态路由保护?

如何使覆盖div与可水平滚动的父div相关?

如何使用JavaScript将文本插入空div

Chromium会将URL与JS一起传递到V8吗?

我的服务工作器没有连接到我的Chrome扩展中的内容脚本.我该怎么解决这个问题?

无法访问Vue 3深度监视器中对象数组的特定对象值'

使用Java脚本导入gltf场景并创建边界框

JavaScript是否有多个`unfined`?

如何使用JS创建一个明暗功能按钮?

无法避免UV:flat的插值:非法使用保留字"

如果没有页面重新加载Angular ,innerHTML属性绑定不会更新

对具有相似属性的对象数组进行分组,并使用串连的值获得结果

在将元素追加到DOM之前,createElement()是否会触发回流?混淆abt DocumentFragment行为

每隔一行文本段落进行镜像(Boustrophedon)

需要从对象生成列表

JQuery-无法 Select 使用elementor添加的元素的值