javascript - 使用关键字搜索 json

标签 javascript json

我正在努力解决一件小事,需要一些帮助。我必须创建一个通用搜索输入来搜索音乐编号的 json。用户必须能够在搜索栏中输入专辑/轨道或艺术家,然后他才会得到结果。就像任何其他搜索栏一样。只有这个搜索基于按键而不是提交按钮。

我卡住的部分是我收到了一个包含 5000 多个条目的大型 JSON 文件。我的搜索栏必须能够根据部分键入的“关键字”识别条目。因此,例如,如果我想搜索 madonna 并输入“mado”,我应该已经在我的结果中得到了一些 madonna(当然,它可能会得到其他标题中有 mado 或其他东西的条目!)。

对不起,我的语法不够好,但我会尽力解释情况!

现在开始提问!我正在努力解决的问题是我如何循环遍历 json 文件来搜索这些关键字。这是我收到的 json 的一小部分:

{
"1": {
    "track": "Dani California",
    "artist": "Red Hot Chili Peppers",
    "album": "Stadium Arcadium"
},
"2": {
    "track": "Tell me baby",
    "artist": "Red Hot Chili Peppers",
    "album": "Stadium Arcadium"
},
"3": {
    "track": "Snow (Hey Oh)",
    "artist": "Red Hot Chili Peppers",
    "album": "Stadium Arcadium"
}}

通常我会创建一个像这样的函数:

for(var i = 0; i < data.length; i++){
if(data[i].album == 'red hot'){
    console.log(data[i].album)
}}

但在这种情况下,我想遍历 json,寻找包含搜索值的实体并将其保存到对象中以供以后使用

是否可以一次完成所有这些?因此,要立即检查艺术家/标题/专辑,还是创建一个小过滤器会更好?

如果我的解释有任何不清楚的地方,请与我会面,我已尽力做到尽可能清楚!

最佳答案

我认为搜索 5000 个条目不会导致性能问题。 查看此代码,当您调用 search('text')

时,它应该会返回所需的条目
var data = JSON.parse('JSON DATA HERE') // dataset
var search_fields = ['track','artist','album'] //key fields to search for in dataset

function search(keyword){
    if(keyword.length<1) // skip if input is empty
        return

    var results = []

    for(var i in data){ // iterate through dataset
        for(var u=0;u<search_fields.length;u++){ // iterate through each key in dataset

            var rel = getRelevance(data[i][search_fields[u]],keyword) // check if there are matches

            if(rel==0) // no matches...
                continue // ...skip

            results.push({relevance:rel,entry:data[i]}) // matches found, add to results and store relevance
        }
    }

    results.sort(compareRelevance) // sort by relevance

    for(i=0;i<results.length;i++){
        results[i] = results[i].entry // remove relevance since it is no longer needed
    }

    return results
}

function getRelevance(value,keyword){
    value = value.toLowerCase() // lowercase to make search not case sensitive
    keyword = keyword.toLowerCase()

    var index = value.indexOf(keyword) // index of the keyword
    var word_index = value.indexOf(' '+keyword) // index of the keyword if it is not on the first index, but a word

    if(index==0) // value starts with keyword (eg. for 'Dani California' -> searched 'Dan')
        return 3 // highest relevance
    else if(word_index!=-1) // value doesnt start with keyword, but has the same word somewhere else (eg. 'Dani California' -> searched 'Cali')
        return 2 // medium relevance
    else if(index!=-1) // value contains keyword somewhere (eg. 'Dani California' -> searched 'forn')
        return 1 // low relevance
    else
        return 0 // no matches, no relevance
}

function compareRelevance(a, b) {
  return b.relevance - a.relevance
}

关于javascript - 使用关键字搜索 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45615509/

相关文章:

javascript - 调试 javascript 和 console.log 不起作用

json - 如何通过 YouTube api v2/v3 (JSON) 获取已删除视频的信息

javascript - 如何使用 React 同步渲染组件(或渲染到字符串)

javascript - 使用 pastebin API 发出简单的 POST 请求

java - 将数组列表对象转换为 jsonarray

json - ElasticClient检查连接状态时出现错误

java - 使用 JAX-RS 和 MOXy 处理无效枚举

javascript - 将 JSON 值组合成一个文本

javascript - 在Javascript中,如何获取鼠标指针所在的div的当前id?

javascript - angularjs指令使用 Controller 作为vm而不是作用域