首页 > 解决方案 > 在对象中添加一个自动递增的数字到推送

问题描述

我有这个函数在这个数组中添加一个对象:

 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) 的索引来删除添加的对象

标签: javascriptarraysauto-increment

解决方案


如果我正确理解您想要实现的目标,我认为确保项目 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 )),它不会改变并且不一定对应于数组中的对象索引。


推荐阅读