首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Twitter typeahead.js和一个用于多个匹配的json对象

Twitter typeahead.js和一个用于多个匹配的json对象
EN

Stack Overflow用户
提问于 2016-04-22 13:54:25
回答 1查看 1.7K关注 0票数 1

我正在编写一个程序,应该能够根据几个课程参数找到一门大学课程。我有一个包含1360个对象的大型json对象,每个对象都有大约20-30个参数。不过,我只对其中的3-5个感兴趣。

我想要做的是能够根据课程的编号、名称、老师的名字或每门课程描述的一组关键词找到一门课程。

不管怎么说。我尝试过使用twitters typeahead.js,据我所知,您需要解析它一个字符串数组,而且它只需要一个数组。难道没有一个简单的方法(或者另一个javascript模块)可以做到这一点吗?

我目前的目标是:

代码语言:javascript
复制
var courses = [
    { "number": "<5 digits>", 
      "name": "<course name>", 
      "teacher": "<teacher name>", 
      "keywords": "<string of keywords>" }
    { ... }
    { ... }
    { ... }
    and so forth..
 ];

正如上面提到的,1360个大小的物体。

我想得到一个类似于以下内容的输出:

然而,我希望能够搜索所提到的参数(数字,名称,教师名称,关键字),并得到任何输入到文本字段的最佳匹配。

有没有人知道如何做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-23 10:57:47

这很容易,但是不是typeahead.js。它存在231未解决的问题(在键入时,有些问题非常严重),并且已经有一年没有更新过了。

使用bootstrap3-typeahead代替。它得到了维护和更新。在进一步阅读之前,先看一下文档。您没有提供JSON,所以我在下面的示例中使用另一个JSON。

您所要做的就是定义一个matcher方法,这里是一个非常简单的不区分大小写的方法,它与JSON项中的所有属性进行比较:

代码语言:javascript
复制
matcher: function(item) {
  for (var attr in item) {
    if (~item[attr].toString().toLowerCase().indexOf(this.query.toLowerCase())) return true
  }
  return false
}

您可以使用displayText (纯示例)覆盖应该在下拉列表中显示的attrs / text:

代码语言:javascript
复制
displayText: function(item) {
  return item.id + ' ' + item.label  + ' ' + item.value
}

如果您想要以复杂的HTML形式完全覆盖项的呈现,请使用displayTexthighlighter的组合,其中每个显示字符串都包含字符串JSON:

代码语言:javascript
复制
displayText: function(item) {
  return JSON.stringify(item) 
},
highlighter: function(item) {
  item = JSON.parse(item)
  return '<span><h4>'+item.value + '</h4>' + item.id  + ' ' + item.label +'</span>'
}

当显示字符串被字符串化时,必须用值属性更新<input>,该属性应该是所选的值:

代码语言:javascript
复制
afterSelect: function(item) {
  this.$element[0].value = item.value
}

完整的例子:

代码语言:javascript
复制
$('#example').typeahead( {
  source: json,
  matcher: function(item) {
    for (var attr in item) {
        if (~item[attr].toString().toLowerCase().indexOf(this.query.toLowerCase())) return true
    }
    return false
  },
  displayText: function(item) {
    return JSON.stringify(item)
  },
  highlighter: function(item) {
    item = JSON.parse(item)
    return '<span><h4>'+item.value + '</h4>' + item.id  + ' ' + item.label +'</span>'
  },
  afterSelect: function(item) {
    this.$element[0].value = item.value
  }
})                

演示-> http://jsfiddle.net/vhme3td1/

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36795726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档