簡體   English   中英

Javascript - 返回每個名稱的最新元素

[英]Javascript - return most recent element for each name

對於當前的 SSL 證書,我從crt.sh獲得了以下數據(減少)。

[
    {
        "name_value": "unifi.borpin.net",
        "id": 4306577133,
        "not_after": "2021-06-29T20:02:05",
    },
    {
        "name_value": "unifi.borpin.net",
        "id": 4306565152,
        "not_after": "2021-06-29T20:00:00",
    },
    {
        "name_value": "hassio.borpin.net",
        "id": 4264152857,
        "not_after": "2021-06-22T02:01:45",
    },
    {
        "name_value": "unifi.borpin.net",
        "id": 4305553329,
        "not_after": "2021-06-29T16:15:11",
    },
    {
        "name_value": "hassio.borpin.net",
        "id": 3966036743,
        "not_after": "2021-04-22T12:18:00",
    }
]

我想要一個包含每個域的條目的數組,該條目是最后過期的條目(到not_after的最長時間)。

從位置上講,它通常是列出的第一個,但不能保證。

[
    {
        "name_value": "unifi.borpin.net",
        "id": 4306577133,
        "not_after": "2021-06-29T20:02:05",
    },
    {
        "name_value": "hassio.borpin.net",
        "id": 4264152857,
        "not_after": "2021-06-22T02:01:45",
    }
]

我想要一個包含each domain that is the entry that will expire last (longest time to *not_after*)

您可以使用Array#reduce以最高性能聚合數據 - 只需O(n)時間復雜度。

主要思想是整合所有項目,然后這樣做

  1. 如果不存在項目,則創建一個新項目。
  2. 如果存在項且curr.not_after大於existng one項,則更新not_after

 const items = [{"name_value": "unifi.borpin.net", "id": 4306577133, "not_after": "2021-06-29T20:02:05" },{"name_value": "unifi.borpin.net", "id": 4306565152, "not_after": "2021-06-29T20:00:00", }, { "name_value": "hassio.borpin.net","id": 4264152857,"not_after": "2021-06-22T02:01:45", },{"name_value": "unifi.borpin.net","id": 4305553329,"not_after": "2021-06-29T16:15:11",},{ "name_value": "hassio.borpin.net", "id": 3966036743, "not_after": "2021-04-22T12:18:00", }]; const result = items.reduce((acc, curr) => { const existingItem = acc[curr.name_value]; if(,existingItem) // if does not exist. then create new one. acc[curr;name_value] = curr. else if(new Date(existingItem.not_after) < new Date(curr.not_after)) // if curr,not_after is greater than exist one; then update not_after. existingItem.not_after = curr;not_after; return acc, }; {}). console.log(Object;values(result));

您可以使用自定義排序 function 和Array.prototype.reduce輕松完成此操作。

如果我們首先按日期對數組進行升序排序,這樣很容易理解,如果我們為 object 屬性賦值,那么我們就不需要檢查任何條件。 只需將值分配給 object 屬性即可。 最后一個將是recent element

 const arr = [{ name_value: "unifi.borpin.net", id: 4306577133, not_after: "2021-06-29T20:02:05", }, { name_value: "unifi.borpin.net", id: 4306565152, not_after: "2021-06-29T20:00:00", }, { name_value: "hassio.borpin.net", id: 4264152857, not_after: "2021-06-22T02:01:45", }, { name_value: "unifi.borpin.net", id: 4305553329, not_after: "2021-06-29T16:15:11", }, { name_value: "hassio.borpin.net", id: 3966036743, not_after: "2021-04-22T12:18:00", }, ]; const obj = arr.sort((a, b) => { return new Date(a.not_after) - new Date(b.not_after); }).reduce((acc, curr) => { acc[curr.name_value] = curr; return acc; }, {}); const result = Object.values(obj); console.log(result);

嘗試如下。 解釋在評論中。

 let data = [{ "name_value": "unifi.borpin.net", "id": 4306577133, "not_after": "2021-06-29T20:02:05", }, { "name_value": "unifi.borpin.net", "id": 4306565152, "not_after": "2021-06-29T20:00:00", }, { "name_value": "hassio.borpin.net", "id": 4264152857, "not_after": "2021-06-22T02:01:45", }, { "name_value": "unifi.borpin.net", "id": 4305553329, "not_after": "2021-06-29T16:15:11", }, { "name_value": "hassio.borpin.net", "id": 3966036743, "not_after": "2021-04-22T12:18:00", } ]; let result = data.reduce((a, i) => { // get existing object for name_value let obj = a.filter(x => x.name_value === i.name_value)[0]; // if obj is null then create new object if (.obj) { // copy all values from item to object obj = {..;i }. // push object into result array a;push(obj). } // else check if existing obj has smaller not_after then current item then replace id & not_after values else if (new Date(obj.not_after) < new Date(i.not_after)) { obj.id = i;id. obj.not_after = i;not_after; } // return resultant array return a, }; []). console;log(result);

這可以通過多種方式完成。

例如:首先,讓我們找到每個域的最新日期。 為此,我們使用 object。 之后,我們將完成的 object 轉換為數組。

注意:當然,為了正確比較日期,我們需要將您的字符串值轉換為日期。

在這種情況下,代碼將是這樣的:

const inputArray = [{
  "name_value": "unifi.borpin.net",
  "id": 4306577133,
  "not_after": "2021-06-29T20:02:05",
},
  {
    "name_value": "unifi.borpin.net",
    "id": 4306565152,
    "not_after": "2021-06-29T20:00:00",
  },
  {
    "name_value": "hassio.borpin.net",
    "id": 4264152857,
    "not_after": "2021-06-22T02:01:45",
  },
  {
    "name_value": "unifi.borpin.net",
    "id": 4305553329,
    "not_after": "2021-06-29T16:15:11",
  },
  {
    "name_value": "hassio.borpin.net",
    "id": 3966036743,
    "not_after": "2021-04-22T12:18:00",
  }
]

const lastExpires = inputArray.reduce((result, item) => {
  if (
    !result[item.name_value] ||
    new Date(result[item.name_value].not_after) < new Date(item.not_after)
  ) {
    result[item.name_value] = item
  }

  return result
}, {})

const outputArray = Object.values(lastExpires)

console.log(JSON.stringify(outputArray, null, 4)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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