javascript - 在对象中添加一个自动递增的数字到推送
问题描述
我有这个函数在这个数组中添加一个对象:
addSomething(array) {
const something = {
id: number
defaulTimeStart: "08:00",
defaultTimeEnd: "00:00",
delete: true,
};
array.time.push(something);
},
我希望 id 是一个从 0 开始的数字,每次我按下时,这个数字都会增加 1,这样每次我都会有具有不同编号 id 的对象,例如:
array: [
{
id: 0
defaulTimeStart: "08:00",
defaultTimeEnd: "00:00",
delete: true,
},
{
id: 1
defaulTimeStart: "08:00",
defaultTimeEnd: "00:00",
delete: true,
},
{
id: 2
defaulTimeStart: "08:00",
defaultTimeEnd: "00:00",
delete: true,
},
//etc.....
]
注意:我需要这个能够使用该 id 作为 .splice(id, 1) 的索引来删除添加的对象
解决方案
如果我正确理解您想要实现的目标,我认为确保项目 ID 始终等于其在数组中的索引的唯一方法是每次推送新项目或拼接一个或多个现有项目时重新分配 ID那些。为了做到这一点,您可以添加两个自定义方法Array.prototype
:
Array.prototype.pushObjectWithId = function(obj) {
this.push(obj);
this.forEach((item, index) => item.id = index);
}
Array.prototype.spliceWithIdReset = function(index, elements) {
this.splice(index, elements);
this.forEach((item, index) => item.id = index);
}
const myArr = [];
function addSomething(array) {
const something = {
defaulTimeStart: "08:00",
defaultTimeEnd: "00:00",
delete: true,
};
array.pushObjectWithId(something);
}
// test
console.log('myArr (initial):', myArr);
addSomething(myArr);
addSomething(myArr);
addSomething(myArr);
addSomething(myArr);
console.log('myArr (after adding 4 items):', myArr);
myArr.spliceWithIdReset(2, 1);
console.log('myArr (after removing 1 item starting from index 2):', myArr);
addSomething(myArr);
addSomething(myArr);
console.log('myArr (after adding 2 more items):', myArr);
myArr.spliceWithIdReset(1, 3);
console.log('myArr (after removing 3 items starting from index 1):', myArr);
addSomething(myArr);
console.log('myArr (after adding 1 more item):', myArr);
无论如何,在我看来,拥有不断变化的 ID 违背了 ID 的概念。我认为你应该放弃能够
使用该 id 作为 .splice(id, 1) 的索引来删除添加的对象
并简单地实现一个自动增量 ID(例如 with array.length === 0 ? 0 : Math.max(...array.map(item => item.id) + 1 )
),它不会改变并且不一定对应于数组中的对象索引。
推荐阅读
- scala - 一个方法的两个具有相同名称的隐式定义
- amazon-iam - CodePipeline ECS 蓝/绿部署跨账户失败并出现 PermissionError
- mysql - 同一张表中的主键和索引
- azure - 使用证书对 Azure Keyvault 进行身份验证并获取机密
- groovy - 如果 getCellType() 包含在对 null 的检查中,为什么我会使用 getCellType() 得到这个 NullPointerException?
- reactjs - 传递道具时,Mobx observable 和 componentDidUpdate() 的行为不符合预期 [Typescript React]
- python - python:转换频率图列表的快速方法
- javascript - 如何使用范围 JavaScript 将字符串转换为数组
- r - 如何在 R 中调整岭图的带宽
- java - 在加载片段之前显示插页式广告