Javascript 如何获得具有条件的唯一对象数组?

Javascript 如何获得具有条件的唯一对象数组?,javascript,node.js,arrays,mongodb,Javascript,Node.js,Arrays,Mongodb,我有一个对象数组 我需要得到一个与最新的日期唯一的网站名称数组 样本数据 "data" : [ { "position" : 2, "website" : "abc.com", "owned" : false, "date" : "2020-05-06", "dateTime" : ISODate("2020-05-06T00:00:00.000Z") }, { "position" : 3, "website" : "qwe.com"

我有一个对象数组

我需要得到一个与最新的日期唯一的网站名称数组

样本数据

"data" : [ 
{
    "position" : 2,
    "website" : "abc.com",
    "owned" : false,
    "date" : "2020-05-06",
    "dateTime" : ISODate("2020-05-06T00:00:00.000Z")
}, 
{
    "position" : 3,
    "website" : "qwe.com",
    "owned" : false,
    "date" : "2020-05-06",
    "dateTime" : ISODate("2020-05-06T00:00:00.000Z")
}, 
{
    "position" : 1,
    "website" : "qwe.com",
    "owned" : false,
    "date" : "2020-04-06",
    "dateTime" : ISODate("2020-04-06T00:00:00.000Z")
}, 
{
    "position" : 6,
    "website" : "xyz.agency",
    "owned" : false,
    "date" : "2020-05-06",
    "dateTime" : ISODate("2020-05-06T00:00:00.000Z")
}, 
{
    "position" : 4,
    "website" : "opq.com",
    "owned" : true,
    "date" : "2020-05-06",
    "dateTime" : ISODate("2020-05-06T00:00:00.000Z")
}, 
{
    "position" : 2,
    "website" : "opq.com",
    "owned" : true,
    "date" : "2020-05-06",
    "dateTime" : ISODate("2020-05-06T00:00:00.000Z")
},
{
    "position" : 4,
    "website" : "opq.com",
    "owned" : true,
    "date" : "2020-04-01",
    "dateTime" : ISODate("2020-04-01T00:00:00.000Z")
}
]
基于日期时间、位置和网站。需要mongoDB查询或Javascript代码。更早的日期时间和网站

提取具有最高日期和唯一网站名称且排名靠前的对象

预期反应

 "data" : [ 
{
    "position" : 2,
    "website" : "abc.com",
    "owned" : false,
    "date" : "2020-05-06",
    "dateTime" : ISODate("2020-05-06T00:00:00.000Z")
}, 
{
    "position" : 3,
    "website" : "qwe.com",
    "owned" : false,
    "date" : "2020-05-06",
    "dateTime" : ISODate("2020-05-06T00:00:00.000Z")
}, 
{
    "position" : 6,
    "website" : "xyz.agency",
    "owned" : false,
    "date" : "2020-05-06",
    "dateTime" : ISODate("2020-05-06T00:00:00.000Z")
}, 
{
    "position" : 2,
    "website" : "opq.com",
    "owned" : true,
    "date" : "2020-05-06",
    "dateTime" : ISODate("2020-05-06T00:00:00.000Z")
}
],

使用forEach并构建一个对象来处理数据并仅维护新的日期项。 从上面的对象获取Object.values

常量uniq=arr=>{ 常数res={}; arr.forEachitem=>{ 如果 !res[项目.网站]|| new Dateitem.dateTime>new Dateres[item.website].dateTime { res[item.website]={…item}; } }; 返回Object.values; }; //更新uniq2 常量uniq2=arr=>{ 常数res={}; arr.forEachitem=>{ if!res[项目网站]{ res[item.website]={…item}; }否则{ 如果new Dateitem.dateTime>new Dateres[item.website].dateTime{ res[item.website].dateTime=item.dateTime; } 如果item.position>res[item.website].position{ res[item.website].position=item.position; } } }; 返回Object.values; }; 常数数据2=[ { 职位:2, 网址:abc.com, 拥有:假, 日期:2020-05-06, 日期时间:2020-05-06T00:00:00.000Z, }, { 职位:3, 网址:qwe.com, 拥有:假, 日期:2020-05-06, 日期时间:2020-05-06T00:00:00.000Z, }, { 职位:1,, 网址:qwe.com, 拥有:假, 日期:2020-04-06, 日期时间:2020-04-06T00:00:00.000Z, }, { 职位:6, 网站:xyz.agency, 拥有:假, 日期:2020-05-06, 日期时间:2020-05-06T00:00:00.000Z, }, { 职位:1,, 网址:opq.com, 是的, 日期:2020-05-06, 日期时间:2020-05-06T00:00:00.000Z, }, { 职位:2, 网址:opq.com, 是的, 日期:2020-05-06, 日期时间:2020-05-06T00:00:00.000Z, }, { 职位:3, 网址:opq.com, 是的, 日期:2020-04-01, 日期时间:2020-04-01T00:00:00.000Z, }, ]; console.loguniq2data2 使用forEach并构建一个对象来处理数据并只维护新的日期项。 从上面的对象获取Object.values

常量uniq=arr=>{ 常数res={}; arr.forEachitem=>{ 如果 !res[项目.网站]|| new Dateitem.dateTime>new Dateres[item.website].dateTime { res[item.website]={…item}; } }; 返回Object.values; }; //更新uniq2 常量uniq2=arr=>{ 常数res={}; arr.forEachitem=>{ if!res[项目网站]{ res[item.website]={…item}; }否则{ 如果new Dateitem.dateTime>new Dateres[item.website].dateTime{ res[item.website].dateTime=item.dateTime; } 如果item.position>res[item.website].position{ res[item.website].position=item.position; } } }; 返回Object.values; }; 常数数据2=[ { 职位:2, 网址:abc.com, 拥有:假, 日期:2020-05-06, 日期时间:2020-05-06T00:00:00.000Z, }, { 职位:3, 网址:qwe.com, 拥有:假, 日期:2020-05-06, 日期时间:2020-05-06T00:00:00.000Z, }, { 职位:1,, 网址:qwe.com, 拥有:假, 日期:2020-04-06, 日期时间:2020-04-06T00:00:00.000Z, }, { 职位:6, 网站:xyz.agency, 拥有:假, 日期:2020-05-06, 日期时间:2020-05-06T00:00:00.000Z, }, { 职位:1,, 网址:opq.com, 是的, 日期:2020-05-06, 日期时间:2020-05-06T00:00:00.000Z, }, { 职位:2, 网址:opq.com, 是的, 日期:2020-05-06, 日期时间:2020-05-06T00:00:00.000Z, }, { 职位:3, 网址:opq.com, 是的, 日期:2020-04-01, 日期时间:2020-04-01T00:00:00.000Z, }, ]; console.loguniq2data2 在javascript中,您可以减少它:

var数据=[{位置:0,网站:abc.com,拥有:false,日期:2020-05-06,日期时间:'ISODate2020-05-06T00:00:00.000Z'},{位置:0,网站:qwe.com,拥有:false,日期:2020-05-06,日期时间:'ISODate2020-05-06T00:00:00.000Z'},{职位:0,网站:qwe.com,所有者:false,日期:2020-04-06,日期时间:'ISODate2020-04-06T00:00:00.000Z'},{职位:0,网站:xyz.agency,所有者:false,日期:2020-05-06,日期时间:'ISODate2020-05-06T00:00:00.000Z'},{职位:1,网站:opq.com,拥有:true,日期:2020-05-06,日期时间:'ISODate2020-05-06T00:00:00.000Z'},{职位:1,网站:opq.com,拥有:true,日期:2020-04-01,日期时间:'ISODate2020-04-01T00:00:00.000Z'}]; var result=data.reduceac,elem=>{ isPresent=acc.findIndexk=>k.website==elem.website; ifisPresent==-1{ 根据普希勒姆; }否则{ ifnew Dateacc[isPresent].date在javascript中,您可以减少它:

var数据=[{位置:0,网站:abc.com,拥有:false,日期:2020-05-06,日期时间:'ISODate2020-05-06T00:00:00.000Z'},{位置:0,网站:qwe.com,拥有:false,日期:2020-05-06,日期时间:'ISODate2020-05-06T00:00:00.000Z'},{职位:0,网站:qwe.com,所有者:false,日期:2020-04-06,日期时间:'ISODate2020-04-06T00:00:00.000Z'},{职位:0,网站:xyz.agency,所有者:false,日期:2020-05-06,日期时间:'ISODate2020-05-06T00:00:00.000Z'},{职位:1,网站:opq.com,拥有:true,日期:2020-05-06,日期时间:'ISODate2020-05-06T00:00:00.000Z'},{职位:1,网站:opq.com,拥有:true,日期:2020-04-01,日期时间:'ISODate2020-04-01T00:00:00.000Z'}]; var result=data.reduceac,elem=>{ isPresent=acc.findIndexk=>k.website==elem.website; ifisPresent==-1{ 根据普希勒姆; }否则{ ifnew Dateacc[isPresent].dateconsole.logresult;尝试此操作-当对象重复且日期时间相同/相等时,也会考虑此操作:

 var d = { "data" : [ 
{
    "position" : 0,
    "website" : "abc.com",
    "owned" : false,
    "date" : "2020-05-06",
    "dateTime" : "2020-05-06T00:00:00.000Z"
}, 
{
    "position" : 0,
    "website" : "qwe.com",
    "owned" : false,
    "date" : "2020-05-06",
    "dateTime" : "2020-05-06T00:00:00.000Z"
}, 
{
    "position" : 0,
    "website" : "xyz.agency",
    "owned" : false,
    "date" : "2020-05-06",
    "dateTime" : "2020-05-06T00:00:00.000Z"
}, 
{
    "position" : 1,
    "website" : "opq.com",
    "owned" : true,
    "date" : "2020-05-06",
    "dateTime" : "2020-05-06T00:00:00.000Z"
}
]
}


console.logfiltered;

尝试此操作-当对象重复且日期时间相同/相等时,也会考虑此操作:

 var d = { "data" : [ 
{
    "position" : 0,
    "website" : "abc.com",
    "owned" : false,
    "date" : "2020-05-06",
    "dateTime" : "2020-05-06T00:00:00.000Z"
}, 
{
    "position" : 0,
    "website" : "qwe.com",
    "owned" : false,
    "date" : "2020-05-06",
    "dateTime" : "2020-05-06T00:00:00.000Z"
}, 
{
    "position" : 0,
    "website" : "xyz.agency",
    "owned" : false,
    "date" : "2020-05-06",
    "dateTime" : "2020-05-06T00:00:00.000Z"
}, 
{
    "position" : 1,
    "website" : "opq.com",
    "owned" : true,
    "date" : "2020-05-06",
    "dateTime" : "2020-05-06T00:00:00.000Z"
}
]
}


console.logfiltered

那么数据是每个文档中的一个数组字段吗?或者数据是一个文档数组?我们应该把数据作为数组字段吗?那么数据在每个文档中都是数组字段吗?或者数据是一个文档数组?我们应该将数据作为数组字段吗?它是isPresent=data.findIndexk=>k.website==elem.website吗?@AshwanthMadhav否它将是acc,它是reduce fn的累加器。我们将在哪里检查数据是否已经存在。它是isPresent=data.findIndexk=>k.website==elem.website吗?@AshwanthMadhav否它将是acc,它是reduce fn的累加器。我们将在那里检查数据是否已经存在。是新的Dateitem.dateTime>new Dateres[item.website].dateTime吗?是的,我的意思是。很好,ashwanth。我刚刚更新了我的问题。你能检查一下吗。“我必须使其具有唯一的顶级位置。@AshwanthMadhav,你的意思是说,对于一个网站,需要提取最新日期,并且顶级位置是一个小数字吗?”?来自不同对象的两个属性?如果是这种情况,请使用我刚才在回答中更新的uniq2方法。是new Dateitem.dateTime>new Dateres[item.website].dateTime吗?哦,是的,我的意思是。很好,ashwanth。我刚刚更新了我的问题。你能检查一下吗。“我必须使其具有唯一的顶级位置。@AshwanthMadhav,你的意思是说,对于一个网站,需要提取最新日期,并且顶级位置是一个小数字吗?”?来自不同对象的两个属性?如果是这种情况,请使用uniq2方法,我刚才在回答中更新了该方法。