2012-11-15 67 views
1

我有结构化的数据,其中包含各种类型的数据。为了简单起见,假设我有这样的事情:自动完成结构化数据

{ 
    person : [ 
    { 
     name : 'paul', 
     title : 'prof', 
     profession : 'teacher', 
     start: '2010-10-10' 
    }, 
    { 
     name : 'joe', 
     title : 'dr', 
     profession : 'scientist', 
     start: '2000-01-01' 
    } 
    ] 
    book : [ 
    { 
     title : 'the cat in the hat' 
    } 
    ] 
} 

我想在JavaScript中的自动完成对话框,让我选择这些结构性元素的名称,以便下面的结果将返回给定字母输入:

't' : {'person.title', 'book.title'} 
'p' : {'person', 'person.profession'} 

对我来说重要的是,该人可能知道树内任何变量的名称。因此,如果他们输入顶级变量的名称,我只想显示一个子元素而没有子元素,但是如果他们输入子元素的名称,我需要该子元素的完整路径显示。如果他们输入一个顶级变量(“人物”),我不想显示所有的子元素,只有那些始终以相同字母集合开头的子元素。

与正常的自动完成相比,当前是否有任何库可以执行此操作(提供一种对结构化数据执行自动完成的方法)?

澄清:我想我需要的是能够告诉自动完成库的输入和输出的地图工作,这样键入“p”将最终击中输入“人”和从而返回“person”和“person.profession”,并在“title.title”的“person.title”和“title”中输入“t”作为“职业”。

+0

让我澄清。你是说你想要自动完成属性名称或它们的值吗? – Bruno

+0

属性名称可以更好地(容易地)用下拉式服务。不是我说自动完成不能做同样的... –

+0

@Pushpesh,我同意。对于非自由形式的输入下拉FTW。他们也有自动完成功能。 – katspaugh

回答

1

只是写道,递归某个对象以作为数组例如检索FULLPATH属性名称的功能person.title。该阵列可以与jQueryUI autocomplete功能一起使用。请看小提琴以确认这是你想要的。

小提琴here

var retrieveUniqueProps = (function () { 

    var result = []; 
    var added = {}; 

    isArray = function(o) { 
     return Object.prototype.toString.call(o) === "[object Array]"; 
    }; 

    isObject = function(o) { return typeof o === "object"; }; 

    return function (obj, parentPath) { 

     if(isArray(obj)) { 

      for(var i = 0; i < obj.length; i++) { 

       if(isArray(obj[i]) || isObject(obj[i])){ 
        retrieveUniqueProps(obj[i], parentPath); 
       } 
      } 

     } else if (isObject(obj)) { 

      for(var a in obj) { 

       if(obj.hasOwnProperty(a)) { 

        var fullpath = parentPath ? parentPath + "." + a : a; 
        if(!added[ fullpath ]) { 
         result.push(fullpath); 
         added[ fullpath ] = true; 
        } 

        if(isArray(obj[a]) || isObject(obj[a])){ 
         retrieveUniqueProps(obj[a], parentPath ? parentPath + "." + a : a); 
        } 
       } 
      } 
     } 

     return result; 
    }; 


}()); 

var uniquePropertyNames = retrieveUniqueProps(o, ""); 

UPDATE 我已经修改自动完成的源选项以筛选出来的结果按您的要求。最后一个单词必须与您输入到输入中的内容匹配。检查小提琴的更新版本。

$("#props").autocomplete({ 
    source: function(request, response) { 

       // The term the user searched for; 
       var term = request.term; 

       // Extract matching items: 
       var matches = $.grep(uniquePropertyNames, function(item, index) { 
       // Build your regex here: 
       var subArray = item.split("."); 

       if(subArray[subArray.length - 1].indexOf(term) !== 0) return false; 
       return true; 
      }); 

      // let autocomplete know the results: 
      response(matches);   
     } 
}); 
+0

这是自动完成的默认功能,而不是我想要的。我期望的结果与您的解决方案在两个主要方面有所不同:1)当输入'p'时,我应该只看到以该字母开头的单词,而不是“anotherProp”(可能通过某些参数更改轻松修复)。 2)我只想看到结果“人”和“person.profession”,而不是“person.title”。 – 0xdabbad00

+0

@ 0xdabbad00我可以澄清。所以你想返回所有最后一个词以p开始的条目,因为你给出的例子是type t return _person.title_和_book.title_。 – Bruno

+0

这是正确的。你的修复工作。你摇滚!谢谢。这项工作是为网站icebuddha.com,我会确保在那里信誉。 – 0xdabbad00

-1

您可以使用Object.getOwnProperty方法来读取对象的所有键并对结果运行自动填充。

这里的一些讨论 - How to get an object's properties in JavaScript/jQuery?

+0

你的意思是'Object.getOwnPropertyNames'。但是'Object.keys'更好。比较Object.keys([1,2,3])和Object的输出。getOwnPropertyNames([1,2,3])'。 – katspaugh