如何使用对象元素可用的最低可能序列更新数组中的对象元素?

问题描述 投票:2回答:2

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

    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"
          }
        ]

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

javascript arrays typescript
2个回答
2
投票

您可以在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; }

0
投票

看起来您需要为每个键创建一个映射数组,然后使用添加后缀的帮助函数更新name属性。

var instances = {Name: {...}, InstanceId: {...}};
Object.keys(instances).map(name => name).forEach((k) => {
    instances[k].name = addSuffixIfNotExist(instances[k].name, k);
});

function addSuffixIfNotExist(name, index) {
    // code
}
© www.soinside.com 2019 - 2024. All rights reserved.