Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将对象中的自动递增数字添加到推送_Javascript_Arrays_Auto Increment - Fatal编程技术网

Javascript 将对象中的自动递增数字添加到推送

Javascript 将对象中的自动递增数字添加到推送,javascript,arrays,auto-increment,Javascript,Arrays,Auto Increment,我有一个函数,它在数组中添加一个对象: addSomething(array) { const something = { id: number defaulTimeStart: "08:00", defaultTimeEnd: "00:00", delete: true, }; array.time.push(something); }, 我希望id是一个从0开始的数字,每次我按下时,该数字会增加1,这样

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

 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: number

要在数组递增时生成新id,可以使用该id的array.time.length属性的当前长度

根据你的例子

something.id = array.length +1;
array.push(something);

这两个示例的一个问题是,如果从列表中删除一个项目,则ID将不再正确

另一种方法是,从数组中检索最后一个项,读取其中的id并将新项id设置为该id+1。(如果不存在项,则为0)

您在问题中添加了一些内容,使用此id的splice将导致以后出现其他问题。因为拼接以后可能会删除错误的索引。它只适用于第一项。因此,您必须获得具有该id的项的正确索引

function delSomething(array, id) {
  let possibleItem = array.filter((item) => item.id == id)[0];
  if (possibleItem && array.includes(possibleItem))
    array.splice(array.indexOf(possibleItem), 1);
}
如果你想得到一个ID可以是动态的结果,你必须让我们调用函数来检索ID。-这样,就不需要以任何方式设置ID

const something = {
  getId: function getId() { return array.indexOf(this) },
  ...
}

如果我正确理解了您想要实现的目标,那么我认为确保项目ID始终等于其在数组中的索引的唯一方法是在每次推送新项目或拼接一个或多个现有项目时重新分配ID。 为此,您可以将两个自定义方法添加到
数组中。prototype

Array.prototype.pushObjectWithId=函数(obj){
这个。推(obj);
this.forEach((item,index)=>item.id=index);
}
Array.prototype.StripateWithIDReset=函数(索引,元素){
本节:拼接(索引、元件);
this.forEach((item,index)=>item.id=index);
}
常量myArr=[];
函数addSomething(数组){
常数某物={
defaulTimeStart:“08:00”,
defaultTimeEnd:“00:00”,
删除:对,
};
array.pushObjectWithId(某物);
}
//试验
log('myArr(首字母):',myArr);
添加某物(myArr);
添加某物(myArr);
添加某物(myArr);
添加某物(myArr);
log('myArr(添加4项之后):',myArr);
myArr.剪接带IDreset(2,1);
log('myArr(从索引2开始删除1项之后):',myArr);
添加某物(myArr);
添加某物(myArr);
log('myArr(添加两个以上项目后):',myArr);
myArr.拼接带IDreset(1,3);
log('myArr(从索引1开始删除3项之后):',myArr);
添加某物(myArr);

log('myArr(在添加1个项目之后):',myArr)事实上,我没有在这个问题中指定它,我想添加一个我需要的id,然后将其删除而不会出现问题。我尝试了您的上一个示例,但它总是添加id:0对不起,但您的示例包含误导性信息。我认为“array.time”是您示例中的数组。因为您使用
array.time.push
来推送结果。如果
array
是您问题中提到的列表,您只需删除每个元素的.time即可。-我在这里更正了它。对不起,我没有很好地解释我自己,我在我的问题中添加了一个规范,你写的东西不起作用。我可以问一下
array.time.push的
time
应该是什么吗?这不是使用
Object.defineProperty(某物,'id',{get:function(){return array.indexOf(this);}时的“唯一方法”)
something.id
将返回一个引用数组内索引的id。如果从数组中删除了项,则返回-1。否则,将使用正确的索引进行拼接。修改数组时,无需反复重新分配它。@Christopher你是对的,我没有考虑过它。无论如何,总有潜在的可能性拥有多个具有相同ID的对象(从数组中删除的对象,这些对象可能会在代码中的其他地方使用,也可能不会在代码中的其他地方使用)的问题。这也是我建议的解决方案的一个问题,这就是为什么我倾向于不鼓励在数组中保持对象ID与其索引对齐的想法。
const something = {
  id: array.length ? array[array.length-1].id + 1 : 0,
  defaulTimeStart: "08:00",
  defaultTimeEnd: "00:00",
  delete: true,
};
function delSomething(array, id) {
  let possibleItem = array.filter((item) => item.id == id)[0];
  if (possibleItem && array.includes(possibleItem))
    array.splice(array.indexOf(possibleItem), 1);
}
const something = {
  getId: function getId() { return array.indexOf(this) },
  ...
}