搜索 Json 数组

Posted

技术标签:

【中文标题】搜索 Json 数组【英文标题】:Search Json Array 【发布时间】:2015-02-11 07:24:32 【问题描述】:

我得到了一个如下的 json 数组:

[
    "value":"uk-icon-adjust","title":"Adjust","url":"#", "text":"",
    "value":"uk-icon-adn","title":"Adn","url":"#", "text":"",
    "value":"uk-icon-align-center","title":"Align center","url":"#", "text":"",
    "value":"uk-icon-align-justify","title":"Align justify","url":"#", "text":"",
    "value":"uk-icon-align-left","title":"Align left","url":"#", "text":""
]

我想在这个 json 数组中搜索特定的标题。但问题是,我想用正则表达式搜索。 例如:sb 搜索“ad” -> 该函数应返回前两个 json 字符串(Adjust 和 Adn)。

我不知道,现在设置一个可以实现此目的的javascript函数。

一些想法?

【问题讨论】:

嗨,试试我为此目的创建的库json.spiritway.co 【参考方案1】:

这是一个原生对象。不过,您可以这样做,首先使用 Array.map 创建一个标题数组,然后使用 Array.filter 过滤它们

var titles = obj.filter(function(o)
   return /^ad/i.test(o.title);
).map(function(o) return o.title; );

【讨论】:

@nhahtdh 忘记了。谢谢 map之前使用filter会更有效。 @Cerbrus 我认为这是微优化。我以前没听说过。很想看到这样的链接。老实说 假设您有一个包含 100 个项目的数组: Map->Filter 两次迭代超过 100 个项目,总是导致 200 次迭代。 Filter->Map 首先迭代(过滤)超过 100 个项目,然后迭代剩余的项目。通常,这将导致少于 200 次迭代。仅仅因为某事是一个“微优化”并不意味着考虑你的代码实际上对什么样的数据做了什么是一个坏主意。【参考方案2】:

试试这个:

var array = [
    "value":"uk-icon-adjust","title":"Adjust","url":"#", "text":"",
    "value":"uk-icon-adn","title":"Adn","url":"#", "text":"",
    "value":"uk-icon-align-center","title":"Align center","url":"#", "text":"",
    "value":"uk-icon-align-justify","title":"Align justify","url":"#", "text":"",
    "value":"uk-icon-align-left","title":"Align left","url":"#", "text":""
  ],
  searchString = 'ad',
  searchRegExp = new RegExp(searchString , 'i'); // 'i' makes the RegExp ignore case

var result = array.filter(function(e) // Filter out any items that don't pass the
    return searchRegExp.test(e.title); //  RegExp test.
);

结果:

[
    "value":"uk-icon-adjust","title":"Adjust","url":"#","text":"",
    "value":"uk-icon-adn","title":"Adn","url":"#","text":""
]

如果您需要一个标题数组,则可以映射结果,如下所示:

var titles = result.map(function(e)
    return e.title;
);

标题:

["Adjust", "Adn"]

为了提高效率,您需要过滤数组之后进行此映射。这样,您只需遍历过滤后的结果,而不是先遍历 所有 项以获取标题,然后再次遍历 所有 项以过滤它们.

当然,这可以和过滤结合起来:

var result = array.filter(function(e)
    return searchRegExp.test(e.title);
).map(function(e)
    return e.title;
);

请记住,Array.prototype.filter()Array.prototype.map() 在 IE 8 或更低版本中均不受支持。但是,我链接的页面确实有一些 polyfill 可以使这些功能在旧版本的 IE 中工作。

【讨论】:

如果我有要在外部 json 文件中搜索的 json 数组呢?我是这样尝试的:var array = $.getJSON(url); 但是过滤功能不起作用? @Smeaven:那是因为getJSON 是异步的。 See this question.【参考方案3】:

Amit Joki 的答案是 答案。 如果不想使用 map(),也可以试试:

var json = [
    "value":"uk-icon-adjust","title":"Adjust","url":"#", "text":"",
    "value":"uk-icon-adn","title":"Adn","url":"#", "text":"",
    "value":"uk-icon-align-center","title":"Align center","url":"#", "text":"",
    "value":"uk-icon-align-justify","title":"Align justify","url":"#", "text":"",
    "value":"uk-icon-align-left","title":"Align left","url":"#", "text":""
];

function search(array, re) 
    var regexp = new RegExp(re, 'gi');
    for (var i = 0; i < array.length; i++) 
        return array[i].title.match(regexp);
    
    throw "Couldn't find object like " + re;


console.info(search(json, 'ad'));

【讨论】:

没有obj.map这样的东西。 @Cerbrus: 如果obj 是一个数组。 @MarcoS: 到任何array。在 JavaScript 中,当您谈论对象时,您通常指的是泛型 JS 对象类型。

以上是关于搜索 Json 数组的主要内容,如果未能解决你的问题,请参考以下文章

搜索 Json 数组

在 PostgreSQL 中的 jsonb 列中搜索 json 数组,其中数据为 json 数组

试图在 json 数组中搜索

如何使用 AlamoFire 搜索 JSON API 和解码数组

MySQL通过数组中的键搜索json值

如何使用 Eloquent 在包含对象数组的 json 字段中进行搜索