首页 > 解决方案 > 如何以可用于对象元素的最低序列更新数组中的对象元素?

问题描述

我正在验证和更新对象数组中具有最低可用序列号的对象的名称属性。

    var instances = [
          {
            "Name": "Packer-Builder-01",
            "InstanceId": "i-03802c9af5ca28c15"
          },
          {
            "Name": "Packer-Builder",
            "InstanceId": "i-03802c9af5ca25z17"
          },
          {
            "Name": "Packer-Builder",
            "InstanceId": "i-03802c9af5ca38l21"
          },
          {
            "Name": "Packer-Builder-03",
            "InstanceId": "i-0f9c76032682211e8"
          }
        ]

应该是;

 instances =   [
          {
            "Name": "Packer-Builder-01",
            "InstanceId": "i-03802c9af5ca28c15"
          },
          {
            "Name": "Packer-Builder-02",
            "InstanceId": "i-03802c9af5ca25z17"
          },
          {
            "Name": "Packer-Builder-04",
            "InstanceId": "i-03802c9af5ca38l21"
          },
          {
            "Name": "Packer-Builder-03",
            "InstanceId": "i-0f9c76032682211e8"
          }
        ]

我这样做是从对象数组创建两个数组,然后通过使用每个循环来比较它们。解决方案正在运行,但我觉得这个要求的代码太多了。请提出一些方法?

标签: javascriptarraystypescript

解决方案


您可以在 a 中收集所有使用过的数字,Set并为编号取一个新的未使用值。

var instances = [{ Name: "Packer-Builder-01", InstanceId: "i-03802c9af5ca28c15" }, { Name: "Packer-Builder", InstanceId: "i-03802c9af5ca25z17" }, { Name: "Packer-Builder", InstanceId: "i-03802c9af5ca38l21" }, { Name: "Packer-Builder-03", InstanceId: "i-0f9c76032682211e8" }],
    values = new Set(instances.map(({ Name }) => +Name.match(/\d{2}$/)));

instances.forEach((i => o => {
    if (/\d{2}$/.test(o.Name)) return;
    while (values.has(i)) i++;
    o.Name += '-' + i.toString().padStart(2, '0');
    i++;
})(1));

console.log(instances);
.as-console-wrapper { max-height: 100% !important; top: 0; }


推荐阅读