javascript - 如何以可用于对象元素的最低序列更新数组中的对象元素?
问题描述
我正在验证和更新对象数组中具有最低可用序列号的对象的名称属性。
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"
}
]
我这样做是从对象数组创建两个数组,然后通过使用每个循环来比较它们。解决方案正在运行,但我觉得这个要求的代码太多了。请提出一些方法?
解决方案
您可以在 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; }
推荐阅读
- wpf - 使用后退/下一个按钮 WPF 在单个 ViewModel 中切换 Stackpanel
- python - 处理嵌套梯子python
- python - 将包含数组的字典转换为以数组为字符串的 DataFrame
- crystal-reports - Crystal Report 不遵循数据集中的原始行顺序
- php - SQL 计数和组只返回每个组的第一行
- github - 为什么当我想推送我的仓库时,我推送了 40209 对象
- reactjs - Typescript类型签名函数对象数组参数
- android - 是否有谷歌官方解决方案可以对视图进行模糊效果?
- kotlin - 如何使 Kotlin 列表可变,添加项目,然后迭代生成的不可变列表?
- mysql - 如何根据MYSQL中的日期获取记录