2016-01-15 55 views
0

我需要找出此深度嵌套數組中的哪個對象包含字符串Toys & Games(嵌套中最深的對象)。Underscore.js:在深度嵌套對象中匹配字符串

我試圖選擇具有合適的對象:

var arr = _.filter(data, function(obj) { 
    return _.some(obj.Ancestors, {'Name': "Toys & Games"}); 
}); 

其中data在傳遞給.filter是:

{ 
    "BrowseNodeId":[ 
     "11608080011" 
    ], 
    "Name":[ 
     "Quadcopters & Multirotors" 
    ], 
    "Ancestors":[ 
     { 
      "BrowseNode":[ 
      { 
       "BrowseNodeId":[ 
        "166583011" 
       ], 
       "Name":[ 
        "RC Vehicles" 
       ], 
       "Ancestors":[ 
        { 
         "BrowseNode":[ 
         { 
          "BrowseNodeId":[ 
           "6925830011" 
          ], 
          "Name":[ 
           "RC Vehicles & Parts" 
          ], 
          "Ancestors":[ 
           { 
            "BrowseNode":[ 
            { 
             "BrowseNodeId":[ 
              "276729011" 
             ], 
             "Name":[ 
              "Hobbies" 
             ], 
             "Ancestors":[ 
              { 
               "BrowseNode":[ 
               { 
                "BrowseNodeId":[ 
                 "165795011" 
                ], 
                "Name":[ 
                 "Categories" 
                ], 
                "IsCategoryRoot":[ 
                 "1" 
                ], 
                "Ancestors":[ 
                 { 
                  "BrowseNode":[ 
                  { 
                   "BrowseNodeId":[ 
                    "165793011" 
                   ], 
                   "Name":[ 
                    "Toys & Games" 
                   ] 
                  } 
                  ] 
                 } 
                ] 
               } 
               ] 
              } 
             ] 
            } 
            ] 
           } 
          ] 
         } 
         ] 
        } 
       ] 
      } 
      ] 
     } 
    ] 
}, 
{ 
    "BrowseNodeId":[ 
     "3226142011" 
    ], 
    "Name":[ 
     "Grown-Up Toys" 
    ], 
    "Children":[ 
     { 
      "BrowseNode":[ 
      { 
       "BrowseNodeId":[ 
        "3226143011" 
       ], 
       "Name":[ 
        "Action & Toy Figures" 
       ] 
      }, 
      { 
       "BrowseNodeId":[ 
        "3226145011" 
       ], 
       "Name":[ 
        "Die-Cast & Toy Vehicles" 
       ] 
      }, 
      { 
       "BrowseNodeId":[ 
        "3226146011" 
       ], 
       "Name":[ 
        "Games" 
       ] 
      }, 
      { 
       "BrowseNodeId":[ 
        "3226148011" 
       ], 
       "Name":[ 
        "Novelty & Gag Toys" 
       ] 
      }, 
      { 
       "BrowseNodeId":[ 
        "3226149011" 
       ], 
       "Name":[ 
        "Puzzles" 
       ] 
      }, 
      { 
       "BrowseNodeId":[ 
        "5483953011" 
       ], 
       "Name":[ 
        "Executive Desk Toys" 
       ] 
      } 
      ] 
     } 
    ], 
    "Ancestors":[ 
     { 
      "BrowseNode":[ 
      { 
       "BrowseNodeId":[ 
        "165795011" 
       ], 
       "Name":[ 
        "Categories" 
       ], 
       "IsCategoryRoot":[ 
        "1" 
       ], 
       "Ancestors":[ 
        { 
         "BrowseNode":[ 
         { 
          "BrowseNodeId":[ 
           "165793011" 
          ], 
          "Name":[ 
           "Toys & Games" 
          ] 
         } 
         ] 
        } 
       ] 
      } 
      ] 
     } 
    ] 
} 

回答

0

我結束了,沒有下劃線這樣做,有一個異步while環代替:

function traverseNodes(nodeList,findMe,callbackMM){ 

    var nodeArr = []; //collect all browse nodes 

    async.eachSeries(nodeList, function(item, callbackZ) { 

     var currentNode = item; 
     var childNodeId = currentNode.BrowseNodeId[0]; //get first ID in nest tree 

     async.whilst(
      function() { 
       if (currentNode.Name && currentNode.Name[0] == findMe){ //we found the string, stop traversing 
        nodeArr.push(childNodeId); 
        return false; 
       }else if (currentNode.Ancestors){ //didn't find string, keep traversing 
        currentNode = currentNode.Ancestors[0].BrowseNode[0]; 
        return true; 
       } 
       else { 
        return false; 
       } 
      }, 
      function (callback) { 
       callback();                 
      }, 
      function (err) { 
       if (err){ 
        console.log('WHILST error in search.js ',err); 
       } 
       callbackZ(); 
      } 
     );  

    }, function done(){ 
     if (nodeArr.length > 0){              
      callbackMM(nodeArr.toString()); 
     } 
     else { 
      console.log('error: no browseNodes found') 
     }           
    });         

}