2012-01-19 4 views
0

У меня есть массив, содержащий объекты. Каждый объект имеет поле id. Я хочу реализовать функцию, которая удаляет объект, указав идентификатор. Я использую .each от prototypejs в массиве, чтобы проходить через объекты и проверять идентификатор. Если это соответствует, как я могу удалить его? Я попытался установить объект, возвращенный с .each на null, но с использованием FireBug я вижу, что объект все тот же в массиве.Как удалить элемент, возвращаемый из каждого перечислителя?

EDIT: объекты в массиве, в свою очередь, могут содержать массивы с объектами, которые могут быть удалены. Моя функция отлично подходит для поиска объекта, который нужно удалить, и я использую сплайсинг, чтобы удалить его (используя счетчик). Мне кажется, что .each (и другие перечисления вроде .reject) возвращает копию объекта. Если я установил объект в значение 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

Мне кажется, что ваша функция возвращает все объекты, которые не совпадают с идентификатором. Вы хотите, чтобы возвращаемый массив использовался для замены текущего массива? В моей реализации объекты могут иметь массивы самих объектов. Я отредактирую свой вопрос, чтобы уточнить. –

+0

Да, это то, что я намеревался. Или вы можете сделать его методом «Array.prototype» и использовать его цепным образом. – clockworkgeek

Смежные вопросы