2016-05-11 3 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) 

Однако, когда я console.log (favoriteBook), я вижу массив с одним возвращаемым объектом, который соответствует, а также «undefined» для всех тех, которые не совпадают. Как я могу остановить его, как только он найдет совпадение и просто вернет его? Интересно, как это сделать с помощью «фильтра», если это возможно (?) Или аналогичным образом.

Спасибо.

+2

Вы ищете метод '.filter()', а не '.map()' – Pointy

+1

Также значение 'this' в этом обратном вызове будет не таким, как * вне * обратного вызова. – Pointy

ответ

4

Я предполагаю, что это зависит, если вы хотите, чтобы соответствовать несколько книг или просто одного.

Matching Несколько книг

Вы можете сделать это с помощью функции filter(), которая будет обрабатывать несколько книг:

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

Matching одной книги

В противном случае, вы, вероятно, хотите функция find() для возврата одного:

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

Примечание: Будьте предельно внимательны, как вы используете this ключевое слово, как это может резко измениться в контексте одного из вызовов функций. Возможно, вы захотите сохранить его до вызова функций или ссылки на него другим способом, чтобы избежать неожиданных результатов.

+0

Исправьте, но еще раз обратите внимание на предостережение в моем комментарии к OP о значении' this' в этом обратном вызове. – Pointy

2

Вы хотите .find (https://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 - Yep - Я предположил, что '.find' был тем, что искал OP, поскольку переменная была' favoriteBook'. – tymeJV

+0

Да, это было не очень ясно. Однако, пытаясь искать по id, заголовок вопроса говорит «согласованные значения». @tymeJV – crabbly

1

Попробуйте это:

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

Попробуйте использовать .filter(), чтобы получить только те товары, которые вы хотите, и после этого используйте .map(), чтобы получить конкретное поле.

Смежные вопросы