2013-05-01 42 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; 
    }