如何使用对象元素可用的最低可能序列更新数组中的对象元素?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用对象元素可用的最低可能序列更新数组中的对象元素?相关的知识,希望对你有一定的参考价值。
我正在使用最低可用序列号验证和更新对象数组中对象的名称属性。
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"
}
]
我这样做是从对象数组创建两个数组,然后通过使用每个循环比较它们。解决方案正在运行,但我觉得这个要求的代码太多了。请建议一些方法?
答案
您可以在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; }
另一答案
看起来您需要为每个键创建一个映射数组,然后使用添加后缀的帮助函数更新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
}
以上是关于如何使用对象元素可用的最低可能序列更新数组中的对象元素?的主要内容,如果未能解决你的问题,请参考以下文章