javascript - 基于循环的扩展算法
问题描述
我的算法计算通过 DOM 的路径。它从给定的组件开始,然后向上爬。每次父组件具有特定属性时,算法都会将其值添加到路径中。
_computePath(aComponent) {
let result = '';
let parent = aComponent.parentNode;
while (parent.tagName !== 'MY-ROOT-COMPONENT') {
if (parent.hasAttribute('my-attribute')) {
result = `/${parent.getAttribute('my-attribute')}${result}`;
}
parent = parent.parentNode;
}
return result;
}
在我的应用程序的另一部分,我需要一个稍微不同的版本。
_computePath(aComponent) {
let result = '';
let parent = aComponent.parentNode;
while (parent.tagName !== 'MY-ROOT-COMPONENT') {
if (parent.tagName === 'SPECIAL-COMPONENT') {
result = null;
break;
}
if (parent.condition === 'special') {
result = null;
break;
}
if (parent.hasAttribute('my-attribute')) {
result = `/${parent.getAttribute('my-attribute')}${result}`;
}
parent = parent.parentNode;
}
return result;
}
如何在不重复代码的情况下扩展第一个循环的算法?
可能有一个非常简单的解决方案,但不知何故我无法弄清楚。
谢谢
解决方案
让函数接受一个回调来测试导致它中断的条件。
_computePath(aComponent, stopfun = parent => false) {
let result = '';
let parent = aComponent.parentNode;
while (parent.tagName !== 'MY-ROOT-COMPONENT') {
if (stopfun(parent)) {
result = null;
break;
}
if (parent.hasAttribute('my-attribute')) {
result = `/${parent.getAttribute('my-attribute')}${result}`;
}
parent = parent.parentNode;
}
return result;
}
let result1 = obj1._computePath(component1); // no extra stop check
let result2 = obj2._computePath(component2, parent => parent.tagName === 'SPECIAL-COMPONENT' || parent.condition === 'special');
推荐阅读
- soap - DocuSign SOAP 错误:此帐户缺少足够的权限
- java - ResponseStatusException 类的错误处理
- java - 如何自定义我的 log4j2.xml 参数
- python - 有没有办法在 python 中发送/按下 NUMPAD 键?
- c# - 递归方法的 IEnumerable 比使用 foreach 构造的相同 IEnumerable 慢 10 倍
- sql-server - SQL Server 2017 触发器 - 声明变量
- android - 在运行时验证 android 库的 (aar) 签名
- c - Windows 桌面 API 和 C 运行时库之间的区别?
- javascript - 如何使用 showErrors 函数显示集中的错误消息并更改输入边框颜色
- php - 仅当 url 中没有其他参数时才使用 htaccess 路由