Javascript: Как использовать литералы объектов вместо операторов if и switch для условий на основе выражений? - PullRequest
0 голосов
/ 12 июня 2018

В javascript я хочу по крайней мере рассмотреть возможность использования литерального дерева вложенных объектов для моего потока управления вместо операторов if, операторов switch и т. Д.

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

// if & else if
function getDrink (type) {
  if (type === 'coke') {
    type = 'Coke';
  } else if (type === 'pepsi') {
    type = 'Pepsi';
  } else if (type === 'mountain dew') {
    type = 'Mountain Dew';
  } else {
    // acts as our "default"
    type = 'Unknown drink!';
  }
  return type;
}

// object literal
function getDrink (type) {
  var drinks = {
    'coke': function () {
      return 'Coke';
    },
    'pepsi': function () {
      return 'Pepsi';
    },
    'Mountain Dew': function () {
      return 'Mountain dew';
    },
    'default': function () {
      return 'Unknown drink!';
    }
  };
  return (drinks[type] || drinks['default'])();
}

Это работает при тестировании простого значения, но как я могу превратить следующий оператор switch в структуру управления литералом объекта?

switch (true) {
  case (amount >= 7500 && amount < 10000):
    //code
    break;
  case (amount >= 10000 && amount < 15000):
    //code
    break;

  //etc...

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Это похоже на работу

const getValue = (value) => ({
  [value == 1]: 'Value is 1',
  [value > 1]: 'Value is greater than 1',
  [value < 1]: 'Value is less than 1',
})[true]

console.log(getValue(2));
console.log(getValue(-1)); 
console.log(getValue(-1+2)); // expect 'Value is 1'
0 голосов
/ 12 июня 2018

Я приведу вам пример, чтобы вы могли рассмотреть возможность рефакторинга вашего кода в соответствии с этим решением:

const DRINKS = [
  {
    name: "BestDrink",
    getDrink: () => {
      return "BestDrink on lemon"; //whatever you are willing to;
    }
  }, {
    name: "WorstDrink",
    getDrink: () => {
      return "No alcohol drink"; //whatever you are willing to;
    }
  }
];

function prepareDrink(name) {
  return DRINKS.find(drink => drink.name === name).getDrink();
}

console.log(prepareDrink('WorstDrink')); //you get what you defined in returns in your DRINKS array.

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

edit: небольшие исправления, чтобы код работал:)

Схожий, но немного другой подход:

const DRINKS = {
  getDrink: name => {
    const foundDrink = DRINKS.shelf.find(drink => drink.name === name);
    return foundDrink ? foundDrink.prepare() : "Got nothing but water"
  },
  shelf: [
  {
    name: "BestDrink",
    prepare: () => {
      return "BestDrink on lemon"; //whatever you are willing to;
    }
  }, {
    name: "WorstDrink",
    prepare: () => {
      return "No alcohol drink"; //whatever you are willing to;
    }
  }
  ]
};

console.log(DRINKS.getDrink('BestDrink')); //you get what you defined in returns in your DRINKS array.
0 голосов
/ 12 июня 2018

Небольшой помощник usong Array.find может быть полезен:

 const firstCase = (...cases) => value => cases.find(c=> c[0](value))[1];

, который можно использовать как:

const dayTime = firstCase(
  [t =>  t < 5, "night"],
  [t => t < 12, "morning"],
  [t => t < 18, "evening"],
  [true, "night"]
);

console.log(dayTime(10)); // morning

, который также работает с функциями:

const greetAtTime = firstCase(
  [t => t < 10, name => `Good morning ${name}!`],
  [t => t > 18, name => `Good evening ${name}!`],
  [true, name => `Hello ${name}!`]
);

console.log(greetAtTime(12)("Jack"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...