2013-05-01 125 views
-1

例如,我有一個JSON數組,如下所示,我將在一個treelist上顯示它,以便用戶可以選擇該項目。現在有一項功能允許用戶搜索列表中的特定文本。這個列表是一個嵌套列表。我使用HTML和Javascript將JSON數組綁定到一個trellist。現在我應該找到一種搜索特定文本的好方法,然後在找到文本時返回包含父節點的對象。如何搜索嵌套對象中的特定文本?

var allcategories= 
[ 
{ 
    "name": "shoes", 
    "subcategories": [ 
     { 
      "name": "man's shoes", 
      "subcategories": [ 
       { 
        "name": "sample name" 
       }, 
       { 
        "name": "sample name", 
        "subcategories": [] 
       } 
      ] 
     }, 
     { 
      "name": "woman's shoes", 
      "subcategories": [] 
     } 
    ] 
}, 
{ 
    "name": "cars", 
    "subcategories": [ 
     { 
      "name": "cars1", 
      "subcategories": [ 
       { 
        "name": "sample name" 
       }, 
       { 
        "name": "sample name", 
        "subcategories": [] 
       } 
      ] 
     } 
    ] 
} 
]; 

所以現在我想用indexOf()函數來搜索結果。如果搜索成功,程序應該返回父類別。任何人在開發代碼時都有相同的問題?

+0

搜索_what_的結果? – 2013-05-01 02:40:03

+0

如果您只需要父類別,請不要使用深度嵌套的數據結構?當然,你總是可以緩解它... – Bergi 2013-05-01 02:44:23

+0

你到目前爲止得到了什麼?爲什麼它不起作用? – RobG 2013-05-01 02:51:57

回答

1

由於BERGI建議,你可以使用一個遞歸函數:

function getCategory(categories, name) { 
    var category, result; 

    for (var i=0, iLen=categories.length; i<iLen; i++) { 
     category = categories[i]; 

     if (category.name == name) { 
     return category; 

     } else if (category.subcategories) { 
     result = getCategory(category.subcategories, name); 

     if (result) return result; 
     } 
    } 
    // return undefined if category name not found 
    } 

注意這將返回第一個子類具有匹配名稱,這樣的名字必須是唯一的。

+0

我想我們不應該在程序中使用「return」,我們可以使用一個數組來存儲結果。因爲我們可能會得到很多「對象」結果。我發現這個程序不能返回包含我找到的特定文本的父節點的json對象。但非常感謝你,你給了我一個好主意。我的最終代碼如下。 – 2013-05-02 03:24:36

0

@Leeli - 你可以使用這個JS庫; DefiantJS(http://defiantjs.com)與JSON結構中的搜索變得微不足道。該lib使用「搜索」方法擴展了全局對象JSON。使用這種方法,您可以使用XPath表達式進行搜索,並且會使用匹配返回一個數組(如果沒有找到匹配項,則返回空數組)。請參閱下面的示例代碼。

這裏是工作提琴:這裏
http://jsfiddle.net/hbi99/wXfE6/

var data = [ 
     { 
      "name": "shoes", 
      "subcategories": [ 
      { 
       "name": "man's shoes", 
       "subcategories": [ 
        { "name": "heels" }, 
        { "name": "loafers" } 
       ] 
      }, 
      { "name": "woman's shoes" } 
      ] 
     }, 
     { 
      "name": "cars", 
      "subcategories": { 
      "name": "cars1", 
      "subcategories": [ 
       { "name": "Sedan" }, 
       { "name": "SUV" } 
      ] 
      } 
     } 
    ], 
    res = JSON.search(data, '//*[name="cars1"]/subcategories'); 

console.log(res[0].name); 
// Sedan 
0

喜是一個jQuery功能我寫的。因爲它在.net中的關聯列表,當沒有子節點時,子列表是一個空對象,所以我必須檢查它是否爲空,而不是簡單地查找它爲空。應該向後兼容,並且作爲解決這個問題的工作方式

function findCategory(categories, categoryId) 
    { 
     var ret = null; 
     $.each(categories, function (e, v) { 
      if (e === categoryId) 
       ret = v; 
      else if (!jQuery.isEmptyObject(v.children)) 
       ret = findCategory(v.children, categoryId); 
      return !ret; //break out of loop when ret not null 
     }); 
     return ret; 
    }