2016-05-11 7 views
2

JSONで作業していて、配列を繰り返し処理したいだけで、探している値が返されます。たとえば、オブジェクトの配列があり、それらのオブジェクトのそれぞれに特定の書籍に関する情報がある場合、その配列の各オブジェクトに対してどのように反復処理を行い、一致するオブジェクトのみを返すことができますか?配列全体を反復処理し、一致した値のみを返しますか?

私のようなので、マップを使用してみました(私はそれがする必要があるように動作しません):

// books is from my imported JSON object 

const favoriteBook = books.map((book) => { 
    if (book.title == this.props.params.id) { 
    return book; 
    } 
}); 

console.log(favoriteBook) 

しかし、私は(favoriteBook)にconsole.logとき、私は見ています一致する1つのオブジェクトが返された配列と、一致しないすべてのものに対して 'undefined'が返されます。どのようにして試合を見つけ、ただそれを返すとすぐに止めることができますか?可能であれば( '?')または同様の方法で 'フィルタ'を使ってこれを行う方法をお聞かせください。

ありがとうございました。

+2

あなたは '.map()'ではなく '.filter()'メソッドを探しています。 – Pointy

+1

また、コールバックの 'this'の値はコールバックの*外部*と同じではありません。 – Pointy

答えて

4

私はあなたが複数の書籍や、単に単一のものと一致する場合、これは依存しているとします。あなたがそうしたいそうでない場合はシングル帳

マッチング

const favoriteBooks = books.filter((b) => { return b.title == this.props.params.id;}); 

、:あなたが複数の本を扱うでしょうfilter()機能を介してこれを実現することができます複数のブック

マッチング

find()は1つを返す関数:

const favoriteBook = books.find((b) => { return b.title == this.props.params.id;}); 

注:が、それは劇的にあなたの関数呼び出しの1の範囲内で変更することができるよう、あなたがthisキーワードを使用する方法の非常に注意して。関数を呼び出す前に格納するか、予期しない結果を避けるために関数を別の方法で参照することを検討することもできます。

+0

正しいですが、そのコールバックの 'this'の値についてのOPへのコメントに注意してください。 – Pointy

2

あなたは.findhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

const favoriteBook = books.find((book) => { 
    return book.title == this.props.params.id 
}.bind(this)); //.bind for context of 'this' 
+0

'.find'は最初の一致のみを返します。特定のオブジェクトを検索しようとすると便利ですが、条件に一致する複数のオブジェクトを返す必要がある場合、これは機能しません。 https://jsfiddle.net/crabbly/1gm8x6sm/ – crabbly

+0

@crabbly - はい。私は '.find'は変数が' favoriteBook'だったので、OPが探していたものと仮定しました。 – tymeJV

+0

さて、それはあまり明確ではありませんでした。しかし、IDで検索しようとすると、質問タイトルに「一致した値」と表示されます。 @tymeJV – crabbly

1

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

const favoriteBook = books.find((book) => (book.title === this.props.params.id)); 
1

.filter()を使用して、必要な項目のみを取得し、この後に.map()を入力して、特定のフィールドを取得してください。

関連する問題