我的代码中有一些与此代码段非常相似的地方:
tag_iter = hold_tags_el.firstChild;
do {
if (tag_iter === null) {
hold_tags_el.appendChild(paragraph_el);
break;
}
if (par_el.innerHTML < tag_iter.innerHTML) {
hold_tags_el.insertBefore(paragraph_el, tag_iter);
break;
}
if (tag_iter === hold_tags_el.lastChild) {
NS.insertAfter(tag_iter, paragraph_el);
break;
}
tag_iter = tag_iter.nextSibling;
} while (tag_iter !== null);
这可以抽象为:
tag_iter = ref_el.firstChild;
do {
// loop logic
tag_iter = tag_iter.nextSibling;
} while (tag_iter !== null);
在函数形式中,这看起来像:
电话:
eachChild(par_el, function (tag_iter, par_el) {
// loop logic
});
定义:
NS.eachChild = function (par_el, func, context) {
var iter_el = par_el.firstChild,
result;
do {
result = func.call(context, iter_el, par_el);
if (result) {
break;
}
iter_el = iter_el.nextSibling;
} while (iter_el !== null);
}
是否有实现此模式/习惯用语的库?
可以对eachChild
进行哪些改进?
eachChild
是否有任何错误?
应用我们的成语:
代码段A
NS.eachChild(el, function(tag_iter, par_el){
// first
if (tag_iter === null) {
par_el.appendChild(paragraph_el);
return true;
}
// middle
if (par_el.innerHTML < tag_iter.innerHTML) {
par_el.insertBefore(paragraph_el, tag_iter);
return true;
}
// last
if (tag_iter === hold_tags_el.lastChild) {
par_el.appendChild(paragraph_el);
return true;
}
});
答案 0 :(得分:2)
可以做出哪些改进?
很多。带有do-while循环和许多中断的代码片段过于复杂且难以理解。它可以简化为
var tag_iter = hold_tags_el.firstChild,
search = par_el.innerHTML;
while (tag_iter !== null && search >= tag_iter.innerHTML)
tag_iter = tag_iter.nextSibling;
hold_tags_el.insertBefore(paragraph_el, tag_iter);
请注意insertBefore
null
作为第二个参数,insertAfter(lastChild)
和appendChild
完全相同。
通过这种简化,您不再需要eachChild
功能。但也许有点不同:
NS.findChild = function(parent, condition) {
var child = parent.firstChild;
for (var i=0; child!==null && condition(child, i); i++)
child = child.nextSibling;
return child;
};
// then simply:
var el = NS.findChild(hold_tags_el, function(tag_iter) {
return tag_iter.innerHTML < par_el.innerHTML;
});
hold_tags_el.insertBefore(paragraph_el, el);
是否有实现此模式/习惯用语的库?
我不知道。但是有很多lib使用泛型迭代器方法(其中一些具有break
功能)可以很容易地应用于childNodes
集合。
每个孩子都有错误吗?
即使没有firstChild
(以null
作为参数),它也会调用回调。这至少是非常规的,如果不是错误的 - 不是你对迭代的期望。如果你认为需要它,最好将它作为一个单独的案例(一个单独的回调);否则它需要回调中的额外条件。但是,在给定的用例中,您不需要它,因为这是搜索 - 请参阅上面的findChild
函数 - 其中eachChild
不合适。
可以对
eachChild
进行哪些改进?
除了parEl
之外,反驳论证可能也不错 - 请检查标准forEach
Array method的签名。