在Javascript中搜索对象

时间:2013-07-14 06:12:49

标签: javascript

我的数据结构如下:

participants['John Smith'] = {first_name: 'John', last_name: 'Smith', id: '1'}

现在我有自动填充输入框,参与者只需输入他们的名字,然后输入他们的姓氏。

现在我所做的是我有一个单独的结构来容纳名字,另一个用来容纳姓氏。这也是因为Bootstrap的Typeahead需要一个“source”,所以我只把source:first_names。

所以基本上发生的事情是用户键入他姓名的前几个字母并且他们可以自动完成,然后他们选择姓氏的前几个字母并且他们可以自动完成,如果他们的名字和姓氏匹配然后我会自动填写表格的其余部分。 (现在我假设没有重复的名字)。

我想知道我做的是否正确,因为它看起来太过分了。它有效,但有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

你可以重载typeahead的方法,在搜索匹配时做你需要的,下面是一个基本的代码示例。

因此,在您的情况下,如果第一个名称是单个匹配,您可以自动填写姓氏(如果您认为有意义,则可以自动填写表单的其余部分,我个人不会)

你也可以使用全名作为单个输入字段并自动完成我猜。

    $('#searchBox').typeahead(
    {
        source: function (query, process) {  
            process(theArrayToProcess);
        },
        updater: function (item) {
            callAFunctionToDoSomethingWithMatchedItem(item);
            return item;
        },
        matcher: function (item) {
         if (item.toLowerCase().indexOf(this.query.trim().toLowerCase()) != -1) {
                return true;
         }
        },
        sorter: function (items) {
            return items.sort();
        },
        highlighter: function (item) {
            var regex = new RegExp( '(' + this.query + ')', 'gi' );
            return item.replace( regex, "<strong>$1</strong>" );
        },
    });

答案 1 :(得分:0)

所以我查看了Underscore,我偶然发现了Lodash。我解决了它:

_.uniq(_.pluck(stuff.participants, 'first_name'))
_.uniq(_.pluck(stuff.participants, 'last_name'))

和那样的东西。感谢大家。我之前使用了下划线,但我忘了它。猜猜你真的需要每天编码以保留信息。

Re:重复命名我必须考虑一下。去年有200名参与者,好的事情没有人共享同一个名字。后端对'first_name'和'last_name'有唯一约束。