我在nodejs应用中使用以下代码,从形成邻接表的数据库行数组中构建树:

// Lay out every node in the tree in one flat array.
var flatTree = [];
_.each(rows, function(row) {
    flatTree.push(row);
});

// For each node, find its parent and add it to that parent's children.
_.each(rows, function(row) {
    // var parent = _.find(flatTree, function(p) {
    //     p.Id == row.ParentId;
    // });
    var parent;
    for (var i = 0; i < flatTree.length; i++){
        if (flatTree[i].Id == row.ParentId) {
            parent = flatTree[i];
            break;
        }
    };
    if (parent){
        if (!parent.subItems) {
            parent.subItems = [];
        };
        parent.subItems.push(row);
    }
});


我希望被注释掉的_.find调用与它下面的变通方法for循环完全相同,但是_.find永远不会在flatTree中找到父节点,而for循环始终会。

同样,对_.filter的调用也不起作用,而替代循环则起作用:

// var rootItems = _.filter(flatTree, function (node) {
//     //node.ParentId === null;
//     node.NoParent === 1;
// })
var rootItems = [];
for (var i = 0; i < flatTree.length; i++){
    if (flatTree[i].ParentId == null){
        rootItems.push(flatTree[i]);
    }
}


我正在使用underscore-node程序包,但是尝试过并且与常规underscore程序包具有相同的结果。

最佳答案

只是错过了return

var parent = _.find(flatTree, function(p) {
    return p.Id == row.ParentId; // Return true if the ID matches
    ^^^^^^ <-- This
});


在您的代码中,不会返回任何内容,因此默认情况下将返回undefined,并且parent将不包含任何数据。

关于javascript - Underscorejs'发现'不能按预期工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37775507/

10-09 20:30