Здесь нет асинхронного действия, поэтому нет необходимости отслеживать асинхронное действие с обещанием.
Вероятно, самое простое - отфильтровать отфильтрованный список:
let modItemList = this.props.items;
if (this.state.searchItemName) {
modItemList = modItemList.filter(item => item.name.toLowerCase().includes(lcName));
}
if (this.state.searchItemAddress) {
modItemList = modItemList.filter(item => item.fullAddress.some(e => e.toLowerCase().includes(lcAddress)));
}
Или отфильтруйте один раз и проверьте searchItemName
и searchItemAddress
в обратном вызове:
let modItemList = this.props.items.filter(item =>
(!this.state.searchItemName || item.name.toLowerCase().includes(lcName)) &&
(!this.state.searchItemAddress || item.fullAddress.some(e => e.toLowerCase().includes(lcAddress));
Даже если список состоит из сотен тысяч записей, ни одна из них не будет достаточно медленной, чтобы о ней беспокоиться.
Или, если вас действительно беспокоит двойная фильтрация или повторная проверка, создайте функцию фильтра:
let modItemList;
let filterFunc = null;
if (this.state.searchItemName && this.state.searchItemAddress) {
filterFunc = item => item.name.toLowerCase().includes(lcName) && item.fullAddress.some(e => e.toLowerCase().includes(lcAddress));
} else if (this.state.searchItemName) {
filterFunc = item => item.name.toLowerCase().includes(lcName);
} else if (this.state.searchItemAddress) {
filterFunc = item => item.fullAddress.some(e => e.toLowerCase().includes(lcAddress));
}
modItemList = filterFunc ? this.props.items.filter(filterFunc) : this.props.items;
Это включает в себя повторение, однако, оставляя открытой возможность обновления одного фильтра адресов, но не другого. Вы можете объединить функции фильтра:
let nameCheck = item => item.name.toLowerCase().includes(lcName);
let addressCheck = item => item.fullAddress.some(e => e.toLowerCase().includes(lcAddress));
let modItemList;
if (this.state.searchItemName && this.state.searchItemAddress) {
modItemList = this.props.items.filter(item => nameCheck(item) && addressCheck(item));
} else if (this.state.searchItemName) {
modItemList = this.props.items.filter(nameCheck);
} else if (this.state.searchItemAddress) {
modItemList = this.props.items.filter(addressCheck(item);
}
Если их было больше двух, мы могли бы посмотреть на их размещение в массиве и выполнение
modItemList = this.props.items.filter(item => arrayOfFunctions.every(f => f(item)));
Итак ... много вариантов. : -)
Я использовал includes(x)
вместо indexOf(x) !== -1
выше. Я нахожу это более ясным.