Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.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_Loops - Fatal编程技术网

JavaScript-在迭代期间添加/删除对象数组的元素

JavaScript-在迭代期间添加/删除对象数组的元素,javascript,arrays,loops,Javascript,Arrays,Loops,我有一个例子,需要遍历一个对象数组,检查每个元素上的条件,删除现有对象,并根据条件的结果添加新对象。我目前拥有的代码如下所示,但它当然不起作用 在某些迭代中添加/删除新元素时,迭代数组的正确方法是什么 var arrayOfObjects = [] // a list to store objects of the same time for(var i = 0; i < 5; i++){ arrayOfObjects.push(new someClass()); } while(t

我有一个例子,需要遍历一个对象数组,检查每个元素上的条件,删除现有对象,并根据条件的结果添加新对象。我目前拥有的代码如下所示,但它当然不起作用

在某些迭代中添加/删除新元素时,迭代数组的正确方法是什么

var arrayOfObjects = [] // a list to store objects of the same time
for(var i = 0; i < 5; i++){
  arrayOfObjects.push(new someClass());
}

while(true){
  for(var obj in arrayOfObjects){
    // some conditional check on obj
    // if check is true, delete the obj from array & add a new object
    arrayOfObjects.splice(arrayOfObjects.indexOf(obj),1);
    arrayOfObjects.push(new someClass());    
  }
}
var arrayOfObjects=[]//用于同时存储对象的列表
对于(变量i=0;i<5;i++){
push(newsomeclass());
}
while(true){
for(arrayOfObjects中的var obj){
//obj的一些条件检验
//如果检查为true,则从数组中删除obj并添加新对象
arrayOfObjects.splice(arrayOfObjects.indexOf(obj),1);
push(newsomeclass());
}
}
迭代数组的“正确”方法是使用for循环,因为for..in迭代所有可枚举属性(自有和继承)和顺序是不保证的,因此可能需要额外的检查。for..in对于稀疏数组很有用,但它们并不常见

删除元素或元素在数组中的顺序似乎没有任何理由。要删除它们,只需将对其他对象的引用指定给它们在数组中的索引,例如

while(true){
你真的想让它永远循环吗?我想你应该去掉while块

for (var i=0, iLen=arrayOfObjects.length; i<iLen; i++) {

  // some conditional check on obj
  // if check is true, delete the obj from array & add a new object
  if (check) {
    arrayOfObjects[i] = new someClass();    
  }
}
迭代数组的“正确”方法是使用for循环,因为for..in迭代所有可枚举属性(自有和继承)和顺序是不保证的,因此可能需要额外的检查。for..in对于稀疏数组很有用,但它们并不常见

删除元素或元素在数组中的顺序似乎没有任何理由。要删除它们,只需将对其他对象的引用指定给它们在数组中的索引,例如

while(true){
你真的想让它永远循环吗?我想你应该去掉while块

for (var i=0, iLen=arrayOfObjects.length; i<iLen; i++) {

  // some conditional check on obj
  // if check is true, delete the obj from array & add a new object
  if (check) {
    arrayOfObjects[i] = new someClass();    
  }
}

如果确实需要将新对象添加到数组的末尾

for(var obj = 0; obj < arrayOfObjects.length; obj += 1){
    var index;
    // some conditional check on obj
    // if check is true, delete the obj from array & add a new object
    if(somecondtion) {
        var index = arrayOfObjects.indexOf(obj);
        arrayOfObjects.splice(index, 1);
        arrayOfObjects.push(new someClass());    
        if (index <= obj) {
            obj -= 1;
        }
    }
}
for(var obj=0;objif(index如果确实需要将新对象添加到数组末尾

for(var obj = 0; obj < arrayOfObjects.length; obj += 1){
    var index;
    // some conditional check on obj
    // if check is true, delete the obj from array & add a new object
    if(somecondtion) {
        var index = arrayOfObjects.indexOf(obj);
        arrayOfObjects.splice(index, 1);
        arrayOfObjects.push(new someClass());    
        if (index <= obj) {
            obj -= 1;
        }
    }
}
for(var obj=0;obj如果(index在迭代过程中对对象/数组的修改是反模式。结果是不可预测的。例如,循环也迭代新添加的项,并且每次迭代都可能添加一个新项。因此存在无限循环

更好的解决方案是将项复制/添加到新的空对象/数组中

var结果=[];
arrayOfObjects.forEach(函数(obj){
如果(需要复制(obj)){
结果:推送(obj);
}
如果(isNewObjectRequired(obj)){
result.push(newsomeclass());
}

})
在对象/数组的迭代过程中对其进行的修改是一种反模式。结果是不可预测的。例如,循环也会在新添加的项上进行迭代,并且每次迭代都会添加一个新项。因此存在一个无限循环

更好的解决方案是将项复制/添加到新的空对象/数组中

var结果=[];
arrayOfObjects.forEach(函数(obj){
如果(需要复制(obj)){
结果:推送(obj);
}
如果(isNewObjectRequired(obj)){
result.push(newsomeclass());
}

})
那么问题出在哪里呢?迭代数组并在其中嵌套对象迭代,可能是真的……对我来说是无限的。OP在第一行说它不起作用。然后它就脱离了代码审查的主题。当代码被破坏时,请不要让他们参考代码审查。你的主要问题可能是
while(true)
你将不断重复
for
循环,一次又一次……while循环没有停止或中断。那么问题出在哪里?迭代数组并在其中嵌套对象迭代,可能是真的……对我来说就像一个无穷大的循环。OP在第一行说它不起作用。然后它就脱离了Cod的主题e复查。当代码被破坏时,请不要让他们查阅代码复查。您的主要问题可能是while(true)
你会一遍又一遍地重复
循环的
循环没有停止或中断的余地,而当你发布了这个循环,并且真正地思考原始代码时,它根本就没有意义(原始代码)-我真的看不出来,因为重复使用了索引(obj)作为在indexOf中搜索的项目,可以使用
arrayOfObjects.splice(index,1,new someClass())
替换该对象。但我不认为这比将新对象分配给
arrayOfObjects[index]更好
。这个问题在结尾处添加了一个新对象。没有理由更改逻辑,因为这样做可能有逻辑原因。我并不真的想知道预期的逻辑试图实现什么。我几乎可以看到它,但它不适合我。发布了它,并且真正思考了原始代码,它根本没有意义(原始代码)-我真的看不出,在重新使用索引(obj)作为在indexOf中搜索的项目时,该对象的用途是什么使用
arrayOfObjects.splice(index,1,new someClass())
可以替换该对象。但我不知道如何替换