以递归方式查找数组中的元素

Mdb*_*Mdb 14 javascript algorithm

我有一个对象数组.数组中的每个对象都有一个id和一个item属性,它是一个包含其他对象的数组.我需要能够通过id在数组中找到一个元素.这是我到目前为止所做的一个示例,但递归函数总是返回undefined.

当我多次递归调用函数时,如何退出函数并返回项目?

   $(function () {
    var treeDataSource = [{
        id: 1,
        Name: "Test1",
        items: [{
            id: 2,
            Name: "Test2",
            items: [{
                id: 3,
                Name: "Test3"
            }]
        }]
    }];
    var getSubMenuItem = function (subMenuItems, id) {
        if (subMenuItems && subMenuItems.length > 0) {
            for (var i = 0; i < subMenuItems.length; i++) {
                var item;
                if (subMenuItems[i].Id == id) {
                    item = subMenuItems[i];
                    return item;
                };
                getSubMenuItem(subMenuItems[i].items, id);
            };
        };
    };
    var searchedItem = getSubMenuItem(treeDataSource, 3);
    alert(searchedItem.id);
});
Run Code Online (Sandbox Code Playgroud)

的jsfiddle

Den*_*ret 27

你应该更换

  getSubMenuItem(subMenuItems[i].items, id);
Run Code Online (Sandbox Code Playgroud)

同

  var found = getSubMenuItem(subMenuItems[i].items, id);
  if (found) return found;
Run Code Online (Sandbox Code Playgroud)

为了在找到元素时返回元素.

并且要小心属性的名称,javascript区分大小写,因此您还必须替换

  if (subMenuItems[i].Id == id) {
Run Code Online (Sandbox Code Playgroud)

同

  if (subMenuItems[i].id == id) {
Run Code Online (Sandbox Code Playgroud)

示范


最终(清理)代码:

var getSubMenuItem = function (subMenuItems, id) {
    if (subMenuItems) {
        for (var i = 0; i < subMenuItems.length; i++) {
            if (subMenuItems[i].id == id) {
                return subMenuItems[i];
            }
            var found = getSubMenuItem(subMenuItems[i].items, id);
            if (found) return found;
        }
    }
};
Run Code Online (Sandbox Code Playgroud)