我正在努力解决一件小事,需要一些帮助。我必须创建一个通用搜索输入来搜索音乐编号的 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/