簡體   English   中英

如何在 javascript 中制作唯一數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM