在打字稿中按日期删除重复的部分



我有一个按日期排序的对象列表。每个对象都有以下结构

export class SegmentDTO  {
dateInsert: Date;
dateModified: Date;
id: number;
language: number;
content: string;
}

我想获得基于language属性的区别对象,并采用每种语言中最近的一个(基于dateModified)

我尝试的是:

const listLangOrderByDateASC = this.segments.sort((a, b) => new Date(a.dateInsert).getTime() - new Date(b.dateInsert).getTime());
const result = [...new Map(listSourceLangOrderByDateASC.map(item => [item.language, item])).values()];

这样,我可以获得每种语言的最新对象,但我不知道是否有更好的方法来做到这一点。我发现执行这个操作会获取排序列表的最后一个对象,但我不知道这是否只是幸运。

任何帮助将不胜感激!

您可以使用Array.reduce()来获取最近修改的项目,按语言分组。

我们将创建一个对象,每种语言都有一个键。如果对象在语言键处没有值,则该值具有较旧的修改日期,我们将用新条目替换。

一旦我们将项目分组,我们将再次使用Object.values()

转换为数组

let segments = [ { dateInsert: new Date('2022-06-01T07:00:00Z'), dateModified: new Date('2022-06-02T09:00:00Z'), id: 1, language: 1, content: 'Content', }, { dateInsert: new Date('2022-06-01T07:00:00Z'), dateModified: new Date('2022-06-02T11:00:00Z'), id: 1, language: 1, content: 'Content', }, { dateInsert: new Date('2022-06-01T07:00:00Z'), dateModified: new Date('2022-06-02T14:00:00Z'), id: 1, language: 2, content: 'Content', }, { dateInsert: new Date('2022-06-01T07:00:00Z'), dateModified: new Date('2022-06-01T19:00:00Z'), id: 1, language: 2, content: 'Content', } ];
const result = Object.values(segments.reduce((acc, obj) => { 
if (!acc[obj.language] || (acc[obj.language].dateModified < obj.dateModified)) {
acc[obj.language] = obj;
}
return acc;
}, {}));
console.log('Result:', result)
.as-console-wrapper { max-height: 100% !important; }

我们也可以对Map对象这样做:

const segments = [ { dateInsert: new Date('2022-06-01T07:00:00Z'), dateModified: new Date('2022-06-02T09:00:00Z'), id: 1, language: 1, content: 'Content', }, { dateInsert: new Date('2022-06-01T07:00:00Z'), dateModified: new Date('2022-06-02T11:00:00Z'), id: 1, language: 1, content: 'Content', }, { dateInsert: new Date('2022-06-01T07:00:00Z'), dateModified: new Date('2022-06-02T14:00:00Z'), id: 1, language: 2, content: 'Content', }, { dateInsert: new Date('2022-06-01T07:00:00Z'), dateModified: new Date('2022-06-01T19:00:00Z'), id: 1, language: 2, content: 'Content', } ];
const result = [...segments.reduce((acc, obj) => {
if ((!acc.has(obj.language) || (acc.get(obj.language).dateModified) < obj.dateModified)) {
acc.set(obj.language, obj);
}
return acc;
}, new Map()).values()];
console.log('Result:', result)
.as-console-wrapper { max-height: 100% !important; }

你可以尝试这样做

const segments = [{
dateInsert: new Date('2022-01-01 00:00:00'),
dateModified: new Date('2022-01-01 00:00:00'),
id: 1,
language: 1,
content: 'My content'
},{
dateInsert: new Date('2022-01-01 00:00:00'),
dateModified: new Date('2022-01-02 00:00:00'),
id: 2,
language: 1,
content: 'My content'
}
]

const mostRecentByLanguage = Object.values(segments.reduce((res, item) => {

const existing =  res[item.language] || {dateModified :new Date('1970-01-01 00:00:00')}
return {
...res,
[item.language]: item.dateModified.getTime() > existing.dateModified.getTime() ?item:existing
}
}, {})).flat()
console.log(mostRecentByLanguage)

你可以浏览所有的表元素,切片表从当前索引+1直到最后一个元素,如果你没有找到当前的元素,你推入一个新的表:

var unique =[]
arr.forEach((e,i,s)=>{
if(s.slice(i+1).filter(c=>c.language==e.language).length==0)
unique.push(e)
})

最新更新