Javascript-返回每个名称的最新元素
我从当前SSL证书的Javascript-返回每个名称的最新元素,javascript,sorting,Javascript,Sorting,我从当前SSL证书的crt.sh中获得了以下数据(缩减) [ { "name_value": "unifi.borpin.net", "id": 4306577133, "not_after": "2021-06-29T20:02:05", }, { "name_value": "
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",
}
]
我想要一个数组,每个域有一个条目,该条目是最后一个过期的条目(最长时间是而不是之后)
在位置上,它通常是列出的第一个,但不保证
[
{
"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",
}
]
我想要一个包含一个条目的数组,每个域都是最后一个过期的条目(最长时间为*not_after*)
您可以使用Array#reduce
以最高性能聚合数据-只需O(n)
时间复杂度即可
主要思想是整合所有项目,然后像这样做
如果项目不存在,则创建一个新项目
如果存在项且<代码>之后的当前非\u
大于<代码>存在项,则更新<代码>之后的非\u
const items=[{“name_-value”:“unifi.borpin.net”,“id”:4306577133,“not_-after”:“2021-06-29T20:02:05”},{“name_-value”:“unifi.borpin.net”,“id”:43065152,“not_-after”:“2021-06-29T20:00:00”},{“name_-value”:“hassio.borpin.net”,“id”:4264152857,“not_-after”:“2021-06-22T02:01:45”},{“name"-borpin-id”:“unifi,“not_after”:“2021-06-29T16:15:11”,},{“name_value”:“hassio.borpin.net”,“id”:3966036743,“not_after”:“2021-04-22T12:18:00”,});
常量结果=项目。减少((acc,CUR)=>{
const existingItem=acc[当前名称\值];
如果(!existingItem)//如果不存在,则创建一个新项目。
acc[当前名称\当前值]=当前;
else if(new Date(existingItem.not_after) console.log(Object.values(result));
您可以使用自定义排序功能和
如果我们首先用日期按递增顺序对数组进行排序,那么就很容易理解,这样,如果我们将值赋给object属性,那么就不需要检查任何条件。只需将值赋给object属性。最后一个将是最近的元素
const arr=[{
名称_值:“unifi.borpin.net”,
id:4306577133,
不在“2021-06-29T20:02:05”之后,
},
{
名称_值:“unifi.borpin.net”,
身份证号码:43065152,
不是在“2021-06-29T20:00:00”之后,
},
{
name_value:“hassio.borpin.net”,
身份证号码:4264152857,
不在“2021-06-22T02:01:45”之后,
},
{
名称_值:“unifi.borpin.net”,
id:4305553329,
不是在“2021-06-29T16:15:11”之后,
},
{
name_value:“hassio.borpin.net”,
身份证号码:3966036743,
不是在“2021-04-22T12:18:00”之后,
},
];
常数obj=arr
.排序((a,b)=>{
返回新日期(a.不在之后)-新日期(b.不在之后);
})
.减少((会计科目,当前)=>{
acc[当前名称\当前值]=当前;
返回acc;
}, {});
常量结果=对象值(obj);
console.log(结果);
试试下面的方法。注释中有解释
let数据=[{
“name_value”:“unifi.borpin.net”,
“id”:4306577133,
“不在后面”:“2021-06-29T20:02:05”,
},
{
“name_value”:“unifi.borpin.net”,
“id”:43065152,
“不在之后”:“2021-06-29T20:00:00”,
},
{
“name_value”:“hassio.borpin.net”,
“id”:4264152857,
“不在后面”:“2021-06-22T02:01:45”,
},
{
“name_value”:“unifi.borpin.net”,
“id”:4305553329,
“不在后面”:“2021-06-29T16:15:11”,
},
{
“name_value”:“hassio.borpin.net”,
“id”:3966036743,
“不在后面”:“2021-04-22T12:18:00”,
}
];
让结果=数据。减少((a,i)=>{
//获取名称\值的现有对象
设obj=a.filter(x=>x.name_值===i.name_值)[0];
//如果obj为空,则创建新对象
如果(!obj){
//将所有值从项复制到对象
obj={……i
};
//将对象推入结果数组
a、 推(obj);
}
//否则,检查现有obj是否在当前项之后具有较小的not_值,然后替换id和not_值
否则如果(新日期(目标不在之后)<新日期(目标不在之后)){
obj.id=i.id;
obj.not_after=i.not_after;
}
//返回结果数组
返回a;
}, []);
console.log(result);
这可以通过多种方式完成
例如:首先,让我们查找每个域的最新日期。为此,我们使用一个对象。然后,我们将完成的对象转换为一个数组
注意:当然,为了进行正确的日期比较,我们需要将字符串值转换为日期
在本例中,代码如下所示:
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)
常量输入数组=[{
“name_value”:“unifi.borpin.net”,
“id”:4306577133,
“不在后面”:“2021-06-29T20:02:05”,
},
{
“name_value”:“unifi.borpin.net”,
“id”:43065152,
“不在之后”:“2021-06-29T20:00:00”,
},
{
“name_value”:“hassio.borpin.net”,
“id”:4264152857,
“不在后面”:“2021-06-22T02:01:45”,
},
{
“name_value”:“unifi.borpin.net”,
“id”:4305553329,
“不在后面”:“2021-06-29T16:15:11”,
},
{
“name_value”:“hassio.borpin.net”,
“id”:3966036743,
“不在后面”:“2021-04-22T12:18:00”,
}
]
const lastExpires=inputArray.reduce((结果,项)=>{
如果(
!结果[项目名称\u值]||
新日期(结果[item.name\u value].not\u after)<新日期(item.not\u after)
) {
结果[项目名称\u值]=项目
}
返回结果
}, {})
const outputArray=Object.values(lastExpires)
log(JSON.stringify(outputArray,null,4)
到目前为止您尝试了什么?希望看到您的代码。没有得到任何结果。我设法使用``result=res.reduce(function(r,a){key=a.common_name | | | others';r[key]=r[key]|[];r[key].push(a);返回r;},Object.create(null))“``我还没有找到一个好的例子来开始。我还可以对整个数组进行排序-res2=res.sort((a,b)=>{返回新日期(b.Not_after)-新日期(a.Not_after);});但是我需要