在JSON对象内的Javascriptsearch
我的应用程序中有一个JSONstring/对象。
{"list": [ {"name":"my Name","id":12,"type":"car owner"}, {"name":"my Name2","id":13,"type":"car owner2"}, {"name":"my Name4","id":14,"type":"car owner3"}, {"name":"my Name4","id":15,"type":"car owner5"} ]}
我的应用程序中有一个filter框,当我在该框中键入名称时,我们必须过滤对象并显示结果。
例如,如果用户键入“名称”并命中search,那么我们必须在JSON对象中search全名并返回数组,就像MySQLsearch一样…
我的问题是过滤json对象的string,并返回数组….
你可以循环访问数组并find匹配项:
var results = []; var searchField = "name"; var searchVal = "my Name"; for (var i=0 ; i < obj.list.length ; i++) { if (obj.list[i][searchField] == searchVal) { results.push(obj.list[i]); } }
如果你的问题是,是否有一些内置的东西会为你find,那么不,没有。 你基本上使用String#indexOf
或正则expression式来循环数组来testingstring。
对于循环,你至less有三个select:
-
一个无聊的老循环。
-
在支持ES5的环境中(或使用垫片),
Array#filter
。 -
因为你正在使用jQuery,
jQuery.map
。
无聊的老循环例子:
function search(source, name) { var results = []; var index; var entry; name = name.toUpperCase(); for (index = 0; index < source.length; ++index) { entry = source[index]; if (entry && entry.name && entry.name.toUpperCase().indexOf(name) !== -1) { results.push(entry); } } return results; }
你可以在那里用obj.list
作为source
和所需的名字片段作为name
。
或者如果有机会有空白条目或没有名字的条目,请将if
更改为:
if (entry && entry.name && entry.name.toUpperCase().indexOf(name) !== -1) {
Array#filter
示例:
function search(source, name) { var results; name = name.toUpperCase(); results = source.filter(function(entry) { return entry.name.toUpperCase().indexOf(name) !== -1; }); return results; }
再次,如果有空白条目的机会(例如, undefined
,而不是丢失; filter
将跳过缺less的条目),改变内部返回到:
return entry && entry.name && entry.name.toUpperCase().indexOf(name) !== -1;
jQuery.map
示例(在这里我假设jQuery
= $
,通常情况下,如果您使用noConflict
请将$
更改$
jQuery
):
function search(source, name) { var results; name = name.toUpperCase(); results = $.map(source, function(entry) { var match = entry.name.toUpperCase().indexOf(name) !== -1; return match ? entry : null; }); return results; }
(再次,如有必要,在这里添加entry && entry.name &&
。)
使用PaulGuo的jSQL ,一个使用javascript的SQL数据库。 例如:
var db = new jSQL(); db.create('dbname', testListData).use('dbname'); var data = db.select('*').where(function(o) { return o.name == 'Jacking'; }).listAll();
如果您在应用程序中的多个位置执行此操作,则使用客户端JSON数据库是有意义的,因为创build由array.filter()调用的自定义search函数比替代方法混乱且不易维护。
查看ForerunnerDB,它提供了一个function非常强大的客户端JSON数据库系统,并包含一个非常简单的查询语言,以帮助您完成您正在寻找的内容:
// Create a new instance of ForerunnerDB and then ask for a database var fdb = new ForerunnerDB(), db = fdb.db('myTestDatabase'), coll; // Create our new collection (like a MySQL table) and change the default // primary key from "_id" to "id" coll = db.collection('myCollection', {primaryKey: 'id'}); // Insert our records into the collection coll.insert([ {"name":"my Name","id":12,"type":"car owner"}, {"name":"my Name2","id":13,"type":"car owner2"}, {"name":"my Name4","id":14,"type":"car owner3"}, {"name":"my Name4","id":15,"type":"car owner5"} ]); // Search the collection for the string "my nam" as a case insensitive // regular expression - this search will match all records because every // name field has the text "my Nam" in it var searchResultArray = coll.find({ name: /my nam/i }); console.log(searchResultArray); /* Outputs [ {"name":"my Name","id":12,"type":"car owner"}, {"name":"my Name2","id":13,"type":"car owner2"}, {"name":"my Name4","id":14,"type":"car owner3"}, {"name":"my Name4","id":15,"type":"car owner5"} ] */
免责声明:我是ForerunnerDB的开发者。
我调整了正则expression式来处理JSON。
首先,对JSON对象进行string化。 然后,您需要存储匹配的子string的开始和长度。 例如:
"matched".search("ch") // yields 3
对于一个JSONstring,这是完全相同的(除非你明确search逗号和大括号,在这种情况下,我会推荐你的JSON对象之前执行正则expression式(即认为:,{,})的一些转换。
接下来,您需要重buildJSON对象。 我创作的algorithm通过recursion地从匹配索引向后检测来检测JSON语法。 例如,伪代码可能如下所示:
find the next key preceding the match index, call this theKey then find the number of all occurrences of this key preceding theKey, call this theNumber using the number of occurrences of all keys with same name as theKey up to position of theKey, traverse the object until keys named theKey has been discovered theNumber times return this object called parentChain
有了这些信息,就可以使用正则expression式来过滤JSON对象,以返回键,值和父对象链。
你可以试试这个:
function search(data,search) { var obj = [], index=0; for(var i=0; i<data.length; i++) { for(key in data[i]){ if(data[i][key].toString().toLowerCase().indexOf(search.toLowerCase())!=-1) { obj[index] = data[i]; index++; break; } } return obj; } console.log(search(obj.list,'my Name'));