如何解决从数组中获取最新的重复项/重复项
我有一个数组,想知道哪些重复/重复或更多。
示例:仅当最新项目出现3次或以上时,才获取最新项目。
输入:
const items = [
{id: 3,date: new Date('2020/8/3')},{id: 1,date: new Date('2020/8/1')},date: new Date('2020/8/4')},date: new Date('2020/8/2')},{id: 2,{id: 3,]
现在id 1显示4次,id 2显示2次,id 3显示3次。我想要最新的ID 1和最新的ID 3。
输出:
const frequentItems = [
{id: 3,]
您知道最简单,最简单,最有效的方法吗?
解决方法
您可以在项目之间循环两次:第一次记住每个项目的计数(在下面的代码中的对象counts
中),并记住每个项目的最新值(对象latest
),以及第二次只收集计数超过两倍的数据。
let counts = {};
let latest = {};
for(let x of items) {
if(!counts[x.id]) counts[x.id] = 0;
counts[x.id]++;
if(!latest[x.id] || latest[x.id].date < x.date) latest[x.id] = x;
}
let frequentItems = [];
for(let id in counts) {
if(counts[id] > 2) frequentItems.push(latest[id]);
}
,
最好的运行时是O(n),即使用类似count sort的算法,并留出少量O(n)额外的存储空间;查看下面的代码段
const items = [
{id: 3,date: new Date('2020/8/3')},{id: 1,date: new Date('2020/8/1')},date: new Date('2021/8/2')},{id: 2,date: new Date('2020/8/4')},{id: 3,date: new Date('2022/8/3')},];
// used to keep track of repetition number of each id;
const itemCount = Object.create(null);
// used to random access each object by its key later;
const keyIndexedObjects = Object.create(null);
items.forEach( item => {
const currentItemDate = new Date( item.date );
const prevoiusItemDate = new Date( (keyIndexedObjects[item.id]||{}).date);
// only update key index object if its date is bigger than prevoius date
if(!(prevoiusItemDate &&
(prevoiusItemDate > currentItemDate))){
keyIndexedObjects[item.id] = item;
}
itemCount[item.id] = (itemCount[item.id] || 0) + 1;
});
const desiredOutput = [];
for ( const [key,value] of Object.entries(itemCount) ){
if( value >= 3 ) desiredOutput.push(keyIndexedObjects[key])
}
console.log(desiredOutput)
,
您还可以使用Set
根据定义,它应该/不应包含重复的项目。
- 创建一个新的集
let dataSet = new Set()
2。遍历数据并将项目ID添加到集合中
dataSet.add(item.id)
- 结果数据集将包含唯一的ID
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。