[英]How to make unique array in 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" : 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")
}
]
基於 DateTime、position 和網站。 需要 MongoDB 查詢或 Javascript 代碼。
(可以使用 DateTime 和網站。但是卡在位置上)(從中提取具有最高日期和唯一網站名稱且位置最高的 object)
預期響應
"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")
}
],
使用以下實用程序,您可以在 javascript 中實現所需的 output。 希望這會有所幫助
const getUniqueWebsites = data => { return data.reduce((result, d) => { if(result[d.website]) { if(new Date(result[d.website].dateTime).getTime() < new Date(d.dateTime).getTime()){ result[d.website] = d; } else if(new Date(result[d.website].dateTime).getTime() === new Date(d.dateTime).getTime() && (result[d.website].position) > d.position){ result[d.website] = d; } } else { result[d.website] = d; } return result; },{}) } let data = [ { "position": 2, "website": "abc.com", "owned": false, "date": "2020-05-06", "dateTime": "2020-05-06T00:00:00.000Z" }, { "position": 3, "website": "qwe.com", "owned": false, "date": "2020-05-06", "dateTime": "2020-05-06T00:00:00.000Z" }, { "position": 1, "website": "qwe.com", "owned": false, "date": "2020-04-06", "dateTime": "2020-04-06T00:00:00.000Z" }, { "position": 6, "website": "xyz.agency", "owned": false, "date": "2020-05-06", "dateTime": "2020-05-06T00:00:00.000Z" }, { "position": 4, "website": "opq.com", "owned": true, "date": "2020-05-06", "dateTime": "2020-05-06T00:00:00.000Z" }, { "position": 2, "website": "opq.com", "owned": true, "date": "2020-05-06", "dateTime": "2020-05-06T00:00:00.000Z" }, { "position": 4, "website": "opq.com", "owned": true, "date": "2020-04-01", "dateTime": "2020-04-01T00:00:00.000Z" } ] let result = getUniqueWebsites(data) console.log(Object.values(result))
如果你想從 JS 級別做(警告:低性能):
var maxDate = {}; // temporary variable to store latest date of a website
var websites = data
.map(entry => {
if ((maxDate[entry.website] || 0) < entry.dateTime.getTime()) {
maxDate[entry.website] = entry.dateTime.getTime();
}
return entry;
})
.filter(entry => {
return maxDate[entry.website] === entry.dateTime.getTime();
});
如果你想用 mongodb 查詢: Select Max() with "group by" in mongodb
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.