2012-01-19 31 views
0

我有一个包含对象的数组。每个对象都有一个id字段。我想实现一个通过指定id来删除一个对象的函数。我使用.each从数组的prototypejs中遍历对象并检查id。如果匹配,我该如何删除它?我已经尝试将.each返回的对象设置为null,但使用FireBug,我发现该对象在数组中仍然是相同的。如何删除每个枚举器返回的元素?

编辑:数组中的对象可能反过来包含与可能需要删除的对象的数组。我的功能很好找到要删除的对象,并使用拼接删除它(使用计数器)。在我看来,.each(和其他枚举类似.reject)返回对象的副本。如果我将对象设置为null,那么在检查时对象仍然在数组中。我如何返回一个对象的引用,当设置为null时,它实际上对数组中的对象进行操作,而不是副本?

下面是函数,该函数DeleteChild,则工作在相同的原理:

function removeControl(controlName) { 
var counter = 0; 

cont.each(function (existingControl) { 
    if (existingControl.id == controlName) { 
     existingControl.destroy(); 
     cont.splice(counter, 1); 
    } 
    else { // not found, check control's children 
     existingControl.deleteChild(controlName); 
    } 
    counter++; 
}, this); 

}

回答

0

,当你想要做的事,对每个对象只能使用.each。从语义上讲,你应该在这种情况下使用Enumerable.reject。想想多少时间才能理解你何时需要修复它。

function deleteById(objects, id) { 
    return objects.reject(function(obj) { 
     return obj.id == id; 
    }).each(function(obj) { 
     obj.deleteChild(id); 
    }); 
} 
+0

在我看来,你的函数返回所有与id不匹配的对象。你是否打算返回用于替换当前数组的数组?在我的实现中,对象本身可能有对象数组。我会编辑我的问题来澄清。 –

+0

是的,这是我的意图。或者你可以使它成为'Array.prototype'的一种方法,并以链接的方式使用它。 – clockworkgeek