我有一个以下JSON,通过选择过滤器来执行搜索:
{
"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"
}
]
}
可用的过滤器
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 + ']';
因此,当我第一次点击绑定过滤器时,我得到的查询是//*[contains(binding ,"paperback")]
,当我第二次点击时,返回的查询为//*[contains(binding ,"paperback") and contains(binding ,"boxed set")]
,然后这会正确过滤结果。
但现在的问题是,如果我想获得具有类型pop
的图书然后使用查询//*[contains(category ,"rock")]
我得到
但实际上只有第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"]
,它返回:
我能得到的最近的就是这里。
所以,总结一下我有两个问题:
//*[category[contains(.,"rock,")] or category[contains(.,", rock")] or category ="rock"]
并将其与主 thequeryString 与and
一起加入,则它不会过滤掉正确的结果,因为第一个包含或即可。请帮忙。
注意:defiantjs也有一个&#34; XPath评估员&#34;你可以在哪里检查查询。
答案 0 :(得分:1)
使用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'))