0

例如,我有一个如下的 JSON 数组,我将它显示在树列表上,以便用户可以选择项目。现在有一个功能允许用户搜索列表中的特定文本。该列表是一个嵌套列表。我使用 HTML 和 Javascript 将 JSON 数组绑定到树列表。现在我应该找到一种搜索特定文本的好方法,然后在找到文本时返回包含父节点的对象。

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()功能来搜索结果。如果搜索成功,程序应该只返回父类别。有人在开发代码时有同样的问题吗?

4

3 回答 3

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
  }

请注意,这将返回具有匹配名称的第一个子类别,因此名称需要是唯一的。

于 2013-05-01T03:05:59.387 回答
0

@Leeli - 你可以使用这个 JS 库;在 JSON 结构中搜索的DefiantJS ( http://defiantjs.com ) 变得微不足道。该库使用“搜索”方法扩展了全局对象 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
于 2014-01-07T08:59:17.437 回答
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;
    }
于 2016-09-08T18:28:30.750 回答