使用带有精确标记的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")]我得到了

  1. 书2
  2. 书3
  3. 书4
  4. 书5
  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"]返回:

  1. 书2
  2. 书4
  3. 书5
  4. 书6

我能得到的最近的只是在这里。

所以,总结我有两个问题:

  1. 如何使用我单击的精确filter过滤书籍。 例如,如果我单击Rock,则只返回包含类别rock的Books。
  2. 如果我使用//*[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'))