[英]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)
時間復雜度。
主要思想是整合所有項目,然后這樣做
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.