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

什么是在特定迭代中添加/删除新元素时迭代数组的正确方法。

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 result = [];
arrayOfObjects.forEach(function(obj) {
	if(isCopyRequired(obj)) {
		result.push(obj);
	}

	if(isNewObjectRequired(obj)) {
		result.push(new someClass());
	}
});

10-06 06:17