Переключатель JavaScript (true) выполняет ложные заявления? - PullRequest
0 голосов
/ 02 ноября 2019

Я зацикливаюсь на наборе значений координат и выполняю математические вычисления для координат, чтобы увидеть, находятся ли вычисленные значения в хэш-карте. если они находятся в хэш-карте, то я хочу запустить дополнительную функцию. Так как у меня было несколько случаев, которые я хотел проверить для каждой координаты в коллекции, я подумал, что было бы здорово использовать оператор switch для замены моих операторов if, чтобы все мои проверки можно было визуально и логически сгруппировать. Когда я заменил свои операторы if переключателем, мой код дал плохие результаты. Когда я отлаживал, я понимал, что операторы switch иногда выполняются, даже когда case равен false (я добавил console.logs, чтобы вывести результат того же условия switch, и он напечатал бы false, но должен выполняться только при true). Вот небольшой пример:

var idm = {0:1, 3:1, 9:1, 10:1, 11:1, 12:1, 20:1, 21:1, 23:1}

var findNeighbors = function(b) {

    var u,d,l,r,lRow,rRow;
    var currentBuilding = parseInt(b);
    var currRow = Math.floor(currentBuilding/column);

    //remove value from map so we dont recount it.
    delete idm[currentBuilding];

    u = currentBuilding - column;
    d = currentBuilding + column;
    l = currentBuilding - 1;
    lRow = Math.floor(l/column);
    r = currentBuilding + 1;
    rRow = Math.floor(r/column);

    console.log("current idx:" + currentBuilding);
    console.log("u:" + u + ", d:" + d + ", l:" + l + " r:" + r);
    // debugger;
    switch(true) {
      case (idm.hasOwnProperty(u) === true):
        console.log((idm.hasOwnProperty(u)));
        console.log("map has " + currentBuilding + " -> u: " + u);
        findNeighbors(u);
      case (idm.hasOwnProperty(d) === true):
        console.log((idm.hasOwnProperty(d)));
        console.log("map has " + currentBuilding + " -> d: " + d);
        findNeighbors(d);
      case (lRow === currRow && idm.hasOwnProperty(l) === true):
        console.log((lRow === currRow && idm.hasOwnProperty(l)));
        console.log("map has " + currentBuilding + " -> l: " + l);
        findNeighbors(l);
      case (rRow === currRow && idm.hasOwnProperty(r) === true):
        console.log((rRow === currRow && idm.hasOwnProperty(r)))
        console.log("map has " + currentBuilding + " -> r: " + u);
        findNeighbors(r);
    }
    console.log("---------------------------");
  }

1 Ответ

2 голосов
/ 02 ноября 2019

Я подумал, что было бы неплохо использовать оператор switch, чтобы заменить мои операторы if, чтобы все мои проверки можно было визуально и логически сгруппировать.

Ну, напишите код, который работает, а не код, который выглядит круто. Вы забыли break операторы, поэтому поток выполнения провалился через - без оценки других case выражений после первого совпадения. Кстати, switch использование константы - ужасная (не крутая) практика.

Вместо этого используйте стандартный if / else.

...