我写了代码来删除数组中的重复项,但我觉得它可以做得更优雅。请提出建议。
接口定义
export interface SomeClass {
version: number,
typeDescription: string
}
测试数据
sthClass: SomeClass[] = [
{ typeDescription: "typeA", version: 10 },
{ typeDescription: "typeA", version: 21 },
{ typeDescription: "typeB", version: 101 },
{ typeDescription: "typeC", version: 199 },
{ typeDescription: "typeA", version: 220 },
{ typeDescription: "typeB", version: 33 },
{ typeDescription: "typeA", version: 15},
];
业务逻辑删除重复并保留版本号最大的一个
for (let index = this.sthClass.length - 1; index >= 0; index--) {
filterArr = this.sthClass.filter(item => item.typeDescription == this.sthClass[index].typeDescription);
if (filterArr.length > 1) {
//sort in Desc Order
filterArr.sort((a: SomeClass, b: SomeClass) => b.version - a.version);
let idx = this.sthClass.findIndex(k => filterArr[1] === k)
this.sthClass.splice(idx, 1);
}
}
2条答案
按热度按时间xtfmy6hx1#
一种在线性时间内执行此操作的方法是使用
reduce()
和JS obejct(或者Map
)来有效地查找是否已经遇到具有该值的typeDescription
,以及当前项的版本是否更高。最后,您可以使用Object.values()
获取值。或者:
还可以创建一个工作的,但较慢(
O(n log n)
与上面的O(n)
相比),而且在我看来也不那么优雅的使用排序的解决方案。1.按
typeDescription
排序,然后按降序排序版本1.通过跟踪前一个
typeDescription
只保留组的第一个元素另一种变体只是由于排序而较慢,通常不能比
O(n log n)
更快,但如果由于您的数据,您知道您可以使用一些专门的算法在线性时间内排序,则此解决方案可能更快/更内存有效。i7uq4tfw2#
以下是我的解决方案:
1.初始化一个空对象obj。
1.循环遍历sthClass数组中的每个对象。
1.检查对象中是否存在当前对象的typeDescription属性。
1.如果存在,则将当前对象的version属性与obj中相同typeDescription的现有值进行比较。如果当前对象的版本较大,则用当前对象的版本更新obj中typeDescription的值。
1.如果它不存在,则将当前对象的typeDescription和版本添加到obj。
1.循环结束后,obj将包含唯一的typeDescription和每个typeDescription的最大版本。
代码的输出将是一个对象,其中包含唯一的typeDescription作为键,每个typeDescription的最大版本号作为值。