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 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方法,我刚才在回答中更新了该方法。