Как избежать операторов if-else, которые делают то же самое? - PullRequest
0 голосов
/ 20 мая 2019

Я пытаюсь свернуть небольшую программу js, и я столкнулся с этой проблемой: я не хочу писать много if-else утверждений, что все они делают одно и то же.Есть ли элегантный способ переписать эту функцию?

function advance_bthrads(toCompare, arr) {
    arr.forEach(function(element) {
        if (element.value) {
            let wf = element.value['wait_for'];
            let req = element.value['request'];
            if (wf && req) {
                if (toCompare === wf[0] || toCompare === req[0]) {
                    element = update_element(element);
                }
            } else if (wf) {
                if (toCompare === wf[0]) {
                    element = update_element(element);
                }
            } else if (req) {
                if (toCompare === req[0]) {
                    element = update_element(element);
                }
            }
        }
    });
    return arr;
}

Ответы [ 3 ]

1 голос
/ 20 мая 2019

На мгновение игнорируя тот факт, что element = update_element(element); ничего не достигает (так как вы просто обновляете локальный element, а не то, на что он ссылается), ваше состояние может быть уменьшено до простого

if((wf && wf[0] == toCompare) || (req && toCompare == req[0]))

, так какосновная проверка состоит в том, равняется ли toCompare или wf[0] или req[0], и вы в основном добавляете проверку, чтобы увидеть, существуют ли wf и req.

На данный момент вы можете использовать mapвместо forEach чтобы получить желаемый результат.Обратите внимание, что вы должны return отобразить карту, а при вызове любой функции advance_bthreads необходимо переназначить результат (т. Е. arr = advance_bthreads(toCompare, arr);)

function advance_bthrads(toCompare, arr) {
    return arr.map(function(element) { // NOTICE you have to return the result
        if (element.value) {
            let wf = element.value['wait_for'];
            let req = element.value['request'];
            if((wf && wf[0] == toCompare) || (req && toCompare == req[0]))
                element = update_element(element);
        }
        return element;
    }
}
.
1 голос
/ 20 мая 2019

forEach ничего не возвращает - используйте map:

arr = arr.map(element => {
  if (element.value) {
    let [wf] = element.value['wait_for'] || [0];
    let [req] = element.value['request'] || [0];
    if (wf && req && [wf, req].includes(toCompare)) element = update_element(element);
  }
  return element;
});
0 голосов
/ 20 мая 2019

Вы можете немного сократить его, вернувшись рано и комбинируя условия.

Кстати, назначение не работает, как задумано, вам нужно использовать элемент массива с индексом.

Если update_element видоизменяется element, то присвоение не требуется.

function advance_bthrads(toCompare, arr) {
    arr.forEach(function(element, index, array) {
        if (!element.value) return;
        let wf = element.value['wait_for'];
        let req = element.value['request'];
        if (wf && toCompare === wf[0] || req && toCompare === req[0]) {
            array[index] = update_element(element);
        }
    });
    return arr;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...