2016-10-16 15 views
0

を私は私が提供slugまたはtagsのいずれかによって、コレクションを検索することができます関数を記述しようとしている以下のスラグやタグで配列検索 - javascriptの

items: [ 
{ 
    "slug":"foo", 
    "tags":[ 
      {"value":"bar"}, 
      {"value":"baz"} 
      ] 
}, 
{ 
    "slug":"bar", 
    "tags":[] 
} 

] 

のようなJSONオブジェクトを持っています。だから私が "bar"を検索すると、両方のオブジェクトが見つかるはずです。私は「バズ」を検索すると - のみ最初のオブジェクトが返されるなど

これは私がこれまで持っているもの、

items = items.filter((item) => { 
    var regex = new RegExp(searchTerm, 'g'); 

    if (item.slug.match(regex)){ 
    return true 
    } 

    item.tags.map((tag) => { 
    if (tag.title.match(regex)){ 
     console.log('item found : ',item) 
     return true 
    } 
    }) 

}) 

searchTermは、提供された検索文字列です。

上記のコードは、slug試合が、タグが動作するように見えるいけないアイテムを返すように思われます。問題は、内部マップ関数がフィルタ関数にtrueを返さないということですか?

上記を行うための正しい方法は何ですか?私はプレーンjsを使用することをお勧めします。

おかげ

+0

あなたがタグのタイトル属性を持っている例を提供した場合には参考になります。あなたはどんなタイプの検索をしていますか?私は正規表現の代わりにテストを使用します、それは速く、このコードに適しています。 – nick

答えて

0

あなたはitems = items.filter((item)の結果としてitemsを再定義することにより、元の配列を上書きしています。

またtag.titleの代わりtag.valueを探していました。 items.tagsアレイプロパティが質問にjavascript"tilte"あるオブジェクト要素を有していません。

代替.map()ため.some()を使用して、 .map()Boolean返し.some()新しい配列を返します。

items = [ 
 
{ 
 
    "slug":"foo", 
 
    "tags":[ 
 
      {"value":"bar"}, 
 
      {"value":"baz"} 
 
      ] 
 
}, 
 
{ 
 
    "slug":"bar", 
 
    "tags":[] 
 
} 
 

 
]; 
 

 
var searchTerm = "baz"; 
 

 
var res = items.filter((item) => { 
 
    var regex = new RegExp(searchTerm, 'g'); 
 

 
    if (item.slug.match(regex)){ 
 
    return true 
 
    } 
 

 
    return item.tags.some((tag) => { 
 
    if (tag.value.match(regex)){ 
 
     console.log('item found : ',item) 
 
     return true 
 
    } 
 
    }) 
 

 
}) 
 

 
console.log(res)

+0

'some'のためにありがとうございました..それはすべてのものを動作させます。私は手動でjsonオブジェクトを書きましたので、エラーがありました。 – Kannaj

0

それとも:

var items = [ 
    { 
    "slug":"foo", 
    "tags":[ 
     {"value":"bar"}, 
     {"value":"baz"} 
     ] 
    }, 
    { 
     "slug":"bar", 
     "tags":[] 
    } 
]; 
var searchTerm = "baz"; 
var regex = new RegExp(searchTerm, 'g'); 
results = items.filter(item => (item.slug.match(regex) || item.tags.some(tag => tag.value.match(regex)))); 
console.log(results);