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;obj if(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())
可以替换该对象。但我不知道如何替换