我正在验证和更新object数组中具有最低可用序列号的对象的name属性。
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"
}
]应该是as;
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"
}
]我这样做是通过从对象数组创建两个数组,然后使用for each循环来比较它们。解决方案是有效的,但我觉得它的代码太多,不能满足这个要求。请建议一些方法?
发布于 2019-04-14 23:28:21
您可以将所有使用过的数字收集到一个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; }
发布于 2019-04-14 23:17:01
看起来您需要为每个键创建一个映射数组,然后使用添加后缀的帮助函数更新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
}https://stackoverflow.com/questions/55676717
复制相似问题