Я работаю над очень, очень, очень простой библиотекой , чтобы обеспечить некоторые удобные функции для работы с нативными объектами JavaScript, в идеале (в конечном итоге) в стиле jQuery.
У меня очень простая функция: crawlObject
, которую я изменил, чтобы использовать each()
в jQuery вместо цикла 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, так и "plain"«Объекты JS без дополнительной логики.
Но.
Если я передаю «простой» объект JS, у которого, как оказалось, есть имя свойства «length», каждый () взрывается как нефункциональный феникс.Это может произойти, если я возвращаюсь к большому объекту, определяющему элементы DOM, который может включать свойство длины, предназначенное для указания длины отображения символа в пользовательском интерфейсе.Значение 200 здесь является катастрофическим: внезапно каждый () выполняет итерацию 0-199 для значения реквизита.
Прежде чем я инвестирую в какой-либо дальнейший рефакторинг, кто-нибудь сталкивался с решением этой проблемы?