0

我的代码中有几个地方与此代码段非常相似:

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;
    }
});
4

1 回答 1

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);

是否有实现这种模式/习语的库?

我一个都不知道。但是有许多具有通用迭代器方法的库(其中一些具有break功能)可以轻松应用于childNodes集合。

eachChild 中是否有任何错误?

即使没有firstChildnull作为参数),它也会调用回调。这至少是非常规的,如果不是错误的话——这不是你对迭代的期望。如果您认为需要它,最好将其作为单独的案例(单独的回调);否则它需要回调中的额外条件。但是,在给定的用例中,您不需要它,因为这是一个搜索- 请参阅findChild上面的功能 - 哪里eachChild不合适。

可以做哪些改进eachChild

此外,parEl也许反论点可能会很好 - 检查标准forEachArray 方法的签名。

于 2013-06-27T14:59:43.487 回答