admin管理员组文章数量:1420918
In javascript, I want to at least consider using a nested object literal tree for my control flow instead of if statements, switch statements, etc.
Below is an example of a function using if statements turned into a function using object literals to acplish the same functionality.
// 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'])();
}
In javascript, I want to at least consider using a nested object literal tree for my control flow instead of if statements, switch statements, etc.
Below is an example of a function using if statements turned into a function using object literals to acplish the same functionality.
// 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'])();
}
This works when testing for a simple value, but how could I turn the following switch statement into an object literal control structure?
switch (true) {
case (amount >= 7500 && amount < 10000):
//code
break;
case (amount >= 10000 && amount < 15000):
//code
break;
//etc...
Share
Improve this question
asked Jun 12, 2018 at 12:27
GallaxharGallaxhar
1,0361 gold badge17 silver badges30 bronze badges
6
- 1 You can't have an expression as an object key and I don't see anything wrong with a case or ifs for conditions? Also if your example is as simple as you've demonstrated you don't need to assign a function for every key, a value string would do. – nanobar Commented Jun 12, 2018 at 12:37
- Object keys can be expressions xahlee.info/js/js_object_literal_expression.html – Gallaxhar Commented Jun 12, 2018 at 12:43
- Of course you can do your own putation on a string but it's totally overkill and slower to do so for a stylistic opinion – nanobar Commented Jun 12, 2018 at 12:46
- The goal is to make it look similar to this fiddle, but can't get it working. It's much easier to read. My app does not care about speed. jsfiddle/9txnegvh/11 – Gallaxhar Commented Jun 12, 2018 at 12:47
- jsfiddle/9txnegvh/14 works – Gallaxhar Commented Jun 12, 2018 at 12:50
3 Answers
Reset to default 3A small helper usong Array.find might be useful:
const firstCase = (...cases) => value => cases.find(c=> c[0](value))[1];
Which is usable as:
const dayTime = firstCase(
[t => t < 5, "night"],
[t => t < 12, "morning"],
[t => t < 18, "evening"],
[true, "night"]
);
console.log(dayTime(10)); // morning
That also works with functions:
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"));
You can use the simple way
const handlerPayment = () => { };
const handlerFailure = () => { };
const handlerPending = () => { };
// Switch
switch (status) {
case 'success':
return handlerPayment();
case 'failed':
return handlerFailure();
case 'pending':
return handlerPending();
default:
throw Error('Status not recognize');
}
// Object
const Handlers = {
success: handlerPayment,
failed: handlerFailure,
pending: handlerPending,
}
const handler = Handlers[status];
if (!handler) throw Error('Status not recognize');
return handler();
This appears to work
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'
本文标签:
版权声明:本文标题:Javascript: How to use object literals instead of if and switch statements for expression-based conditions? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1745344655a2654422.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论