Создав ответ гиперслога, вы можете ускорить его, используя стек вместо функции рекурсии. Как показано в этом jsPerf , рекурсия функции на 42% медленнее на моем Chrome 36 на Windows и 71% с IE11 в режиме совместимости с IE8. Кажется, он работает примерно на 20% медленнее в IE11 в режиме edge, но быстрее во всех других проверенных случаях.
function getComments(context) {
var foundComments = [];
var elementPath = [context];
while (elementPath.length > 0) {
var el = elementPath.pop();
for (var i = 0; i < el.childNodes.length; i++) {
var node = el.childNodes[i];
if (node.nodeType === Node.COMMENT_NODE) {
foundComments.push(node);
} else {
elementPath.push(node);
}
}
}
return foundComments;
}
Или как сделано в TypeScript:
public static getComments(context: any): Comment[] {
var foundComments = [];
var elementPath = [context];
while (elementPath.length > 0) {
var el = elementPath.pop();
for (var i = 0; i < el.childNodes.length; i++) {
var node = el.childNodes[i];
if (node.nodeType === Node.COMMENT_NODE) {
foundComments.push(node);
} else {
elementPath.push(node);
}
}
}
return foundComments;
}
Если вы хотите проверить, определен ли метод crop_x
для model
, тогда стандартным способом является использование respond_to?
. Поэтому замените ваше состояние следующим:
if model.respond_to? :crop_x