2016-06-01 6 views
0

私は、オブジェクトは、製品の配列(Product)を反復処理し、this.name === queryの条件を満たしているインスタンスを返すようにする方法を使用するCategory呼ばれています:- JavaScriptの

function Category(products){ 
    this.products = products; 
    this.findProductByName = function(query){ 
    $(this.products).each(function(){ 
     return this.name === query; 
    } 
    } 
} 

マイ(念のため)Product

:私は、その後の製品と Categoryのインスタンスを作成し

function Product(name){ 
    this.name = name; 
} 

var $someCategory = new Category(
    [ 
     new Product('foo'), 
     new Product('bar') 
    ] 
)` 

とするとき、私は呼ん:

$someCategory.findProductByName('foo'); // 'undefined' 

にもかかわらず:

... 
this.findProductByName = function(query){ 
    $(this.products).each(function(){ 
    console.log(this.name === query); // returns 'true' 
    } 
} 
... 

は、私がthis.name === queryが満たされたときにオブジェクトを返すために何をしますか?

+2

'$ .each()'メカニズムは、返された値(ほとんど)を無視します。あなたはそれが何をすると思いますか? – Pointy

+1

each()の代わりに[] .filter()と[] .map()を使用します。 – dandavis

+0

条件が満たされたときに正しい 'Product'インスタンスを返すので' $ someCategory'内の製品を名前で検索できます。 「返された値を無視する」とはどういう意味ですか? –

答えて

1

戻り値(またはmap/reduce)を指定して、関数が一致する結果を返すようにするには、従来のループを使用する必要があります。各関数は、配列内の各要素に対して操作を実行し、フィルタリングは実行せず、戻り値を無視します。

はこれを試してみてください:

this.findProductByName = function(query) { 
    for (var i = 0; i < this.products.length; i++) { 
    if (this.products[i].name === query) 
    { 
     return this.products[i]; 
    } 
    } 
} 

はまたFYI、それはこれを使用した場合の上に反復されている現在の要素が「この」

$(this.products).each(function(index, value) { 
    alert(index + ": " + value); 
}); 
のためのスコープの問題を排除するのに役立ちます識別 each()関数に引数を渡すことが普通です
+0

ニース!ありがとう! Question: 'forループ 'がすでに反復処理を処理してvalを返すとき、なぜ' each'を使うのですか? –

+1

配列内の各項目に対して明示的に操作を実行する、つまりnameプロパティにプレフィックスを追加する場合の構文上の正しさは次のとおりです。 $(this.products).each(function(i、el){el.name = 'My' + el.name;}); –

+1

また、ネイティブのjavascriptよりjqueryが好きな人もいます。 –

2

jQueryを使用する必要がありますか?代わりに配列フィルタメソッドを使用できますか?

function Category(products){ 
    this.products = products; 
    this.findProductByName = function(query){ 
    return this.products.filter(function(item){ 
     return item.name === query; 
    }); 
    }; 
}