2016-06-12 59 views
0

我使用下面的代碼,在一個的NodeJS應用程序,從形成鄰接表數據庫行的一組構建樹:Underscorejs「發現」工作不正常

// 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包相同的結果。

回答

3

剛剛錯過了return

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

在你的代碼不返回任何結果,所以默認undefined將被退回,並parent將不包含任何數據。

+0

是的,謝謝。我在提出這個問題後不久就意識到,正如我在腦海中從箭頭函數語法翻譯的那樣,不需要返回。我太習慣C#LINQ。但是我留下的問題可能會幫助別人,給別人一個回答的機會。 – ProfK