16

私はオブジェクトの配列を持っています。配列内のすべてのオブジェクトには、id と、他のオブジェクトを含む配列である item プロパティがあります。IDで配列内の要素を見つけることができる必要があります。これは私がこれまでに行ったことのサンプルですが、再帰関数は常に未定義を返します。

関数を数回再帰的に呼び出した場合、関数を終了してアイテムを返すにはどうすればよいですか?

   $(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);
});

jsフィドル

4

3 に答える 3

35

交換する必要があります

  getSubMenuItem(subMenuItems[i].items, id);

  var found = getSubMenuItem(subMenuItems[i].items, id);
  if (found) return found;

見つかったときに要素を返すため。

また、プロパティの名前には注意してください。JavaScript では大文字と小文字が区別されるため、次のプロパティも置き換える必要があります。

  if (subMenuItems[i].Id == id) {

  if (subMenuItems[i].id == id) {

デモンストレーション


最終(クリーン)コード:

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;
        }
    }
};
于 2013-01-28T09:48:08.453 に答える