Я работаю над очень, очень, очень простой библиотекой, чтобы предоставить некоторые удобные функции для работы с собственными объектами JavaScript, в идеале (в конечном итоге) в стиле jQuery.
У меня есть очень простая функция: crawlObject, которую я изменил, чтобы использовать jQuery each() вместо цикла for(var key in obj).
function crawlObject(thisObj, onSuccess, doRecursion) {
var stopCrawling = false;
if (isFunction(onSuccess) && ($.isPlainObject(thisObj) || isArray(thisObj))) {
$.each(thisObj, function(childKey, value) {
var childObj = thisObj[childKey];
if (false === stopCrawling) {
stopCrawling = isTrue(onSuccess(childObj, childKey, thisObj, value));
}
if (false === stopCrawling && doRecursion) {
stopCrawling = isTrue(crawlObject(childObj, onSuccess, doRecursion));
}
});
}
return stopCrawling;
}
Преимущество этого заключается в том, что он сканирует как объекты Array, так и «простые» объекты JS без дополнительной логики.
Но.
Если я передам «простой» объект JS, у которого есть имя свойства «длина», каждый () взорвется, как недееспособный феникс. Это может произойти, если я рекурсивно работаю с большим объектом, определяющим элементы DOM, которые могут включать свойство длины, предназначенное для указания длины отображения символов в пользовательском интерфейсе. Значение 200 здесь катастрофично: внезапно каждый() повторяет 0-199 по значению реквизита.
Прежде чем я буду инвестировать в какой-либо дальнейший рефакторинг, кто-нибудь наткнулся на решение этой проблемы?