针对特定案例实施每个子项

时间:2013-06-27 14:30:59

标签: javascript

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

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

1 个答案:

答案 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的签名。