Underscore.js : 匹配深层嵌套对象中的字符串

Underscore.js : matching string in deeply nested objects

我需要找出这个深层嵌套数组中的哪个对象包含字符串 Toys & Games(嵌套中最深的对象)。

我正在尝试 select 正确的对象:

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

传递给 .filterdata 是:

 {  
    "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"
                            ]
                         }
                      ]
                   }
                ]
             }
          ]
       }
    ]
 }

我最终没有使用 Underscore,而是使用了异步 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')
        }                                          
    });                                  

}