使用带有精确标记的Javascript搜索JSON
我有一个以下JSON,通过选择filter来执行搜索:
{ "Books": [ { "title": "Book 1", "binding": "paperback", "category": "pop", "language": "english", "author": "male" }, { "title": "Book 2", "binding": "hardcover", "category": "pop rock,electro pop", "language": "french", "author": "female" }, { "title": "Book 3", "binding": "audiobook", "category": "soft rock", "language": "german", "author": "male,female" }, { "title": "Book 4", "binding": "boxed set", "category": "rock,classic rock", "language": "english", "author": "female,male" }, { "title": "Book 5", "binding": "paperback", "category": "electro pop,rock,classic rock", "language": "french", "author": "male/female" }, { "title": "Book 6", "binding": "paperback", "category": "rock", "language": "french", "author": "male" } ] }
可用的filter是
Binding -Paperback -Hardcover -Audiobook -Boxed Set Category -Classic Rock -Pop -Pop Rock -Electro Pop -Soft Rock -Rock Language -German -English -French Author -Male -Female -Male/Female
我正在使用defiant.js从JSON搜索。 当我使用以下查询时:
var thequery = []; for (var i in searchTags) { for (var j = 0; j < searchTags[i].length; j++) { thequery.push('contains(' + i + ' ,"' + searchTags[i][j] + '")'); } } var thequeryString = thequery.join(' and '); console.log('//*[' + firstqueryString + ']'); return '//*[' + thequeryString + ']';
所以当我第一次点击绑定filter时,我得到的查询是//*[contains(binding ,"paperback")]
当我第二次点击时返回的查询是//*[contains(binding ,"paperback") and contains(binding ,"boxed set")]
,然后正确过滤结果。
但现在的问题是,如果我想获得具有流派的书籍然后使用查询//*[contains(category ,"rock")]
我得到了
- 书2
- 书3
- 书4
- 书5
- 书6
但实际上只有第4册 , 第5 册和第6册都有Rock类。
我试过的另一个问题是:
var thequery = []; for (var i in searchTags) { for (var j = 0; j < searchTags[i].length; j++) { if(i == 'author' || i == 'category'){ thequery.push(i + '[contains(.,"' + searchTags[i][j] + ',")] or ' + i + '[contains(.,",' + searchTags[i][j] + '")] or ' + i + '="' + searchTags[i][j] + '"'); }else{ thequery.push('contains(' + i + ' ,"' + searchTags[i][j] + '")'); } } } var thequeryString = thequery.join(' and '); console.log('//*[' + firstqueryString + ']'); return '//*[' + thequeryString + ']';
我得到的查询是//*[category[contains(.,"rock,")] or category[contains(.,", rock")] or category ="rock"]
返回:
- 书2
- 书4
- 书5
- 书6
我能得到的最近的只是在这里。
所以,总结我有两个问题:
- 如何使用我单击的精确filter过滤书籍。 例如,如果我单击Rock,则只返回包含类别rock的Books。
- 如果我使用
//*[category[contains(.,"rock,")] or category[contains(.,", rock")] or category ="rock"]
并使用主要的thequeryString加入它and
它不会当第一个包含或时,过滤掉正确的结果。
请帮忙。
注意: defiantjs还有一个“XPath Evaluator”,您可以在其中查看查询。
使用forEach
迭代数组并使用indexOf
查找该键中是否存在所需的值
var m = { "Books": [{ "title": "Book 1", "binding": "paperback", "category": "pop", "language": "english", "author": "male" }, { "title": "Book 2", "binding": "hardcover", "category": "pop rock,electro pop", "language": "french", "author": "female" }, { "title": "Book 3", "binding": "audiobook", "category": "soft rock", "language": "german", "author": "male,female" }, { "title": "Book 4", "binding": "boxed set", "category": "rock,classic rock", "language": "english", "author": "female,male" }, { "title": "Book 5", "binding": "paperback", "category": "electro pop,rock,classic rock", "language": "french", "author": "male/female" }, { "title": "Book 6", "binding": "paperback", "category": "rock", "language": "french", "author": "male" } ] } // a function which accepts key which is one of binding,category,language,author. // the array will be filtered on this key function getFilteredElement(key, value) { var bookFilter = []; m.Books.forEach(function(item){ var getFilterField = item[key]; // since the value is a string, so splitting it and creating an array var keyArray = item[key].split(','); // now checking if the passed value has a presence in the above array if (keyArray.indexOf(value) !== -1) { // if present pushed the book name bookFilter.push(item.title); } }); // returning the array of books return bookFilter; } console.log(getFilteredElement('category', 'rock'))