Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从阵列中获取最新的副本/三份副本_Javascript_Arrays_Algorithm_Reduce - Fatal编程技术网

Javascript 从阵列中获取最新的副本/三份副本

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

我有一个数组,想知道哪些是重复的/三次的或更多的

示例:仅当最新项目显示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 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
),第二次记住每个项目的最新计数(object
latest
),第二次只收集计数超过两次的项目

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)

  • 结果数据集将包含唯一的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)
    到目前为止您尝试了什么?我的想法是将intermediate
    const counted
    创建为
    {1:3,2:2,3:3}
    ,然后减少orderd by date项并检查它是否在
    counts
    中,然后查找最新的。我觉得还有更好的方法。为什么id=2的项目没有出现在输出中?编辑:哦,我明白了!您不断更改问题…您希望项目显示2次或更多次,还是3次或更多次?是否要查找至少出现那么多次的
    id
    s,或至少出现那么多次的值?我要查找出现n次或更多次的项(n可以是2或3)。我编辑了我的问题以使它更清楚。这不是OP所问的