2017-12-12 8 views
0

私の検索は、選択フィルタによって実行される以下のJSONを持っている:正確なタグとJavaScriptで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" 
    } 
    ] 
} 

利用できるフィルタは、私はから検索するdefiant.jsを使用しています

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 

です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")]であり、これはその後、正しく結果をフィルタリングします。

しかし、私は私が手//*[contains(category ,"rock")]クエリで、その後のジャンルpopを持っているブックを取得したい場合、問題は今ある

  1. ブック2
  2. ブック3
  3. 帳4
  4. ブック5
  5. 本6

しかし実際には本4,本5本6ロックカテゴリです。

私が試した他のクエリは次のとおりです。

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

私が得ることができる最も近いのはここだけです。

だから、私は2つの問題があるすべての要約:私がクリックした正確なフィルタでブックをフィルタリングする方法

  1. を。例えば。私がロックをクリックすると、カテゴリロックを含む書籍のみが返されます。
  2. 私は//*[category[contains(.,"rock,")] or category[contains(.,", rock")] or category ="rock"]を使用して、最初はまたはが含まれているとして、それは正しい結果をフィルタリングしませんandとメインthequeryStringでそれに参加した場合。

助けてください。

注:defiantjsには、クエリを確認できる「XPath評価ツール」もあります。

+0

に存在するかどうかを見つけるためにindexOfを使用するためには、あなたは明らかにしてくださいすることができ、私が言及している予想される出力 – brk

+0

が何であるかを明確にそれは2度の質問です。私が 'ロック'をクリックすると、ロック3のカテゴリーのみがあるので、ブック4、ブック5、ブック6のみを入手してください。だから、私は正確にクリックされたタグを持つ結果をフィルタリングする必要があります。 – hashtagerrors

答えて

1

使用forEachは、配列を反復処理し、必要な値は、そのキー

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'))

+0

ありがとうございますこれは素晴らしいですが、私はウェブサイトがdefiantjsに依存している多くの機能を持っているのでXPathによる解決策が必要です。だから私はこのメソッドを使用することはできません。 – hashtagerrors

+0

これはjsインビルドメソッド – brk

+0

ありがとう私は今これを使用しています。できます。 – hashtagerrors

関連する問題