Написание операторов if / else с 3 условиями с обещанием, смешанным в - PullRequest
0 голосов
/ 07 сентября 2018

Итак, у меня есть это условное утверждение с 2 условиями, в результате чего

let modItemList = this.props.items

    if (this.state.searchItemName) {   // condition1
        modItemList = (
            this.props.items.filter(
                (item) => item.name.toLowerCase().indexOf(lcName) !== -1    // For name
            )
        );
    } else if (this.state.searchItemAddress) {    //condition2
        modItemList = (
            this.props.items.filter(
                (item) => item.fullAddress.some(e => e.toLowerCase().indexOf(lcAddress) !== -1)      // For Address
            )
        );
    } 

Здесь немного сложно объяснить.

Теперь я хочу добавить третье условие, которое происходит только в том случае, если выполняются оба условия1 и условие2, и в результате получается выполнение кода из условия1 и условия2.

Как мне выразить это?

Ответы [ 4 ]

0 голосов
/ 07 сентября 2018

Здесь нет асинхронного действия, поэтому нет необходимости отслеживать асинхронное действие с обещанием.

Вероятно, самое простое - отфильтровать отфильтрованный список:

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 выше. Я нахожу это более ясным.

0 голосов
/ 07 сентября 2018

Вам все равно придется подождать с действием, пока обещание не будет выполнено и выполнено. Таким образом, вы должны проверить условия внутри обещания обратного вызова, а затем сделать адекватные действия. Пока вы не выполнили обещание, вы можете отображать некоторую информацию о загрузке.

0 голосов
/ 07 сентября 2018

Я думаю, вы просто хотите использовать два отдельных условия if, при которых оба могут выполняться, а не if / else if:

let modItemList = this.props.items;

if (this.state.searchItemName) {   // condition1
    modItemList = modItemList.filter(item =>
        item.name.toLowerCase().indexOf(lcName) !== -1    // For name
    );
}

if (this.state.searchItemAddress) {    //condition2
    modItemList = modItemList.filter(item =>
        item.fullAddress.some(e => e.toLowerCase().indexOf(lcAddress) !== -1)      // For Address
    );
}

Здесь нет ничего асинхронного или предполагающего обещания. Если это произойдет, я бы порекомендовал просто разместить await в соответствующем месте.

0 голосов
/ 07 сентября 2018

Может быть, это решение вы хотите?

if (condition1 & condition2) {
   something = this.props.something.filter(1)).then(this.props.something.filter(2)
} else if (condition1) {
   something = this.props.something.filter(1)
} else if (condition2) {
   something = this.props.something.filter(2)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...