Javascript 从阵列中获取最新的副本/三份副本
我有一个数组,想知道哪些是重复的/三次的或更多的 示例:仅当最新项目显示3次或以上时,才能获取该项目 输入:Javascript 从阵列中获取最新的副本/三份副本,javascript,arrays,algorithm,reduce,Javascript,Arrays,Algorithm,Reduce,我有一个数组,想知道哪些是重复的/三次的或更多的 示例:仅当最新项目显示3次或以上时,才能获取该项目 输入: const items = [ {id: 3, date: new Date('2020/8/3')}, {id: 1, date: new Date('2020/8/1')}, {id: 1, date: new Date('2020/8/4')}, {id: 1, date: new Date('2020/8/2')}, {id: 2, date: new Dat
const items = [
{id: 3, date: new Date('2020/8/3')},
{id: 1, date: new Date('2020/8/1')},
{id: 1, date: new Date('2020/8/4')},
{id: 1, date: new Date('2020/8/2')},
{id: 2, date: new Date('2020/8/1')},
{id: 2, date: new Date('2020/8/4')},
{id: 3, date: new Date('2020/8/3')},
{id: 3, date: new Date('2020/8/4')},
{id: 1, date: new Date('2020/8/3')},
]
现在id 1显示4次,id 2显示2次,id 3显示3次。我要最新的id 1和最新的id 3
输出:
const frequentItems = [
{id: 3, date: new Date('2020/8/4')},
{id: 1, date: new Date('2020/8/4')},
]
你知道最简单有效的方法吗?你可以在项目中循环两次:第一次记住每个项目的计数(在下面的代码中的object
counts
),第二次记住每个项目的最新计数(objectlatest
),第二次只收集计数超过两次的项目
let counts={};
让latest={};
对于(让x个项目){
如果(!counts[x.id])计数[x.id]=0;
计数[x.id]++;
如果(!latest[x.id]| latest[x.id].date2)频繁项。推送(最新[id]);
}
您也可以使用
根据定义,它不包含/不应包含重复项
let dataSet=new Set()
2.遍历数据并将项的id添加到集合中
dataSet.add(item.id)
最好的可能运行时间是O(n),即使用一个类似的算法,有少量的O(n)额外内存空间;查看下面的代码片段
const项=[
{id:3,日期:新日期('2020/8/3')},
{id:1,日期:新日期('2020/8/1')},
{id:1,日期:新日期('2021/8/2')},
{id:2,日期:新日期('2020/8/1')},
{id:2,日期:新日期('2020/8/4')},
{id:3,日期:新日期('2022/8/3')},
{id:3,日期:新日期('2020/8/4')},
{id:1,日期:新日期('2020/8/3')},
];
//用于跟踪每个id的重复编号;
const itemCount=Object.create(null);
//用于以后通过其键随机访问每个对象;
const keyIndexedObjects=Object.create(null);
items.forEach(item=>{
const currentItemDate=新日期(item.Date);
const prevoiusItemDate=新日期((keyIndexedObjects[item.id]|{}).Date);
//仅当键索引对象的日期大于上一个日期时才更新该对象
如果(!(prevoiusItemDate&&
(prevoiusItemDate>currentItemDate))){
keyIndexedObjects[item.id]=项;
}
itemCount[item.id]=(itemCount[item.id]| | 0)+1;
});
常数desiredOutput=[];
for(Object.entries(itemCount))的常量[key,value]{
如果(值>=3)需要输出推送(键索引执行对象[键])
}
console.log(desiredOutput)
到目前为止您尝试了什么?我的想法是将intermediateconst counted
创建为{1:3,2:2,3:3}
,然后减少orderd by date项并检查它是否在counts
中,然后查找最新的。我觉得还有更好的方法。为什么id=2的项目没有出现在输出中?编辑:哦,我明白了!您不断更改问题…您希望项目显示2次或更多次,还是3次或更多次?是否要查找至少出现那么多次的id
s,或至少出现那么多次的值?我要查找出现n次或更多次的项(n可以是2或3)。我编辑了我的问题以使它更清楚。这不是OP所问的