Я пытаюсь отфильтровать список разговоров по именам участников. Имена участников являются свойствами внутри списка участников, а список участников содержится в списке разговоров.
До сих пор я пытался решить проблему, пытаясь вложить фильтры:
let filteredConvos = this.props.convos.filter((convo) => {
return convo.conversation.conversation.participant_data.filter(
(participant) => {
return participant.fallback_name.toLowerCase().indexOf(
this.state.searchTerm.toLowerCase()) !== -1;
})
})
Похоже, это работает, поскольку я могу подтвердить (т.е. я поместил целую кучу console.logs в расширенную версию вышеупомянутого), что по мере обновления состояния searchTerm
оно возвращает соответствие participant
и соответствие convo
. Однако filteredConvos
неправильно отображается для отражения недавно отфильтрованного массива.
Я новичок в Javascript, React и Stack Overflow. Моя лучшая оценка заключается в том, что я неправильно передаю элементы отфильтрованного массива обратно в filteredConvos
, но, честно говоря, у меня недостаточно опыта, чтобы знать.
Любая помощь приветствуется.
Дополнительный контекст:
- Источник данных, с которым я работаю, - это файл JSON, предоставленный Google чата Hangouts в аккаунте.
- HangoutSearch. js:
class HangoutSearch extends Component {
constructor(props) {
super(props);
this.state = {
searchTerm: ''
};
this.handleChange = this.handleChange.bind(this);
}
handleChange(e) {
this.setState({
searchTerm: e.target.value
});
}
render() {
let filteredConvos = this.props.convos.filter((convo) => {
return convo.conversation.conversation.participant_data.filter(
(participant) => {
return participant.fallback_name.toLowerCase().indexOf(
this.state.searchTerm.toLowerCase()) !== -1;
})
})
return(
<div>
<Form>
<Form.Control
placeholder='Enter the name of the chat participant'
value={this.state.searchTerm}
onChange={this.handleChange} />
</Form>
<HangoutList filteredConvos={filteredConvos}/>
</div>
);
}
}
export default HangoutSearch;
class HangoutList extends Component {
render() {
return(
<ListGroup>
{this.props.filteredConvos.map((convo) => {
return (
<ListGroup.Item key={convo.conversation.conversation.id.id}>
{convo.conversation.conversation.participant_data.map(
(participant) => {
return (
<span key={participant.id.gaia_id}>
{participant.fallback_name}
</span>
)
}
)}
</ListGroup.Item>
)
})}
</ListGroup>
);
}
}
export default HangoutList;