Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript-返回每个名称的最新元素_Javascript_Sorting - Fatal编程技术网

Javascript-返回每个名称的最新元素

Javascript-返回每个名称的最新元素,javascript,sorting,Javascript,Sorting,我从当前SSL证书的crt.sh中获得了以下数据(缩减) [ { "name_value": "unifi.borpin.net", "id": 4306577133, "not_after": "2021-06-29T20:02:05", }, { "name_value": "

我从当前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",
    }
]
我想要一个数组,每个域有一个条目,该条目是最后一个过期的条目(最长时间是
而不是
之后)

在位置上,它通常是列出的第一个,但不保证

[
    {
        "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);});但是我需要