我目前正在开始学习 JS,我需要用 switch 语句做以下练习。
function colorMix (color1, color2){
if ((color1 === 'red' && color2 === 'blue') || (color1 === 'blue' && color2 === 'red')){
return 'violet';
} else if ((color1 === 'red' && color2 === 'yellow') || (color1 === 'yellow' && color2 === 'red')){
return 'orange';
} else if ((color1 === 'blue' && color2 === 'yellow') || (color1 === 'yellow' && color2 === 'blue')){
return 'green';
} else {
return 'need to mix two diferent colours'
}
}
let myColor = colorMix('blue', 'blue');
console.log(`The color created is: ${ myColor}`);
这就是我到目前为止所得到的,但它不起作用:
let color1 = '';
let color2 = '';
let firstColour = ((color1 === 'red' && color2 === 'blue') || (color1 === 'blue' && color2 === 'red'))
let secondColour = ((color1 === 'red' && color2 === 'yellow') || (color1 === 'yellow' && color2 === 'red'))
let thirdColour = ((color1 === 'blue' && color2 === 'yellow') || (color1 === 'yellow' && color2 === 'blue'))
function colorMix (color1, color2){
switch (color1, color2){
case 'firstColour':
return 'violet';
break;
case 'secondColour':
return 'orange';
break;
case 'thirdColour':
return 'green';
default:
return 'error';
}
}
let myColour = colorMix('red', 'blue');
console.log(`Colour created is ${myColour}`)
我不知道如何制作 switch 语句来识别我介绍的颜色。有什么想法吗?谢谢!!!
您可以通过将颜色组合到一个键中并打开该键来实现:
function colorMix (color1, color2){
const key = color1 < color2 ? color1 + " \t " + color2 : color2 + " \t " + color1;
switch (key) {
case "blue \t red":
return "violet";
case "red \t yellow");
return "orange";
case "blue \t yellow";
return "green";
default:
return return "need to mix two diferent colours";
}
}
假设颜色名称中没有空格/制表符/空格。
这是可行的,因为我们使用的是可以组合成单个键的字符串。如果我们不这样做,或者表达式更复杂,那么虽然用 switch
来做到这一点是
可能的,但没有充分的理由这样做,你基本上会写出与
if
/else if
链(因为在 JavaScript 中,这就是 switch
的全部 - 与其他具有类似语法的语言不同),并且结果对于其他阅读代码的人来说将是真的令人惊讶。
为了完整起见,以下是一般情况:
// DON'T DO THIS
switch (true) {
case (color1 === 'red' && color2 === 'blue') || (color1 === 'blue' && color2 === 'red'):
return 'violet';
case (color1 === 'red' && color2 === 'yellow') || (color1 === 'yellow' && color2 === 'red'):
return 'orange';
// ...
}
这是可行的,因为 case 标签是 JavaScript 中的表达式,它们按顺序进行测试(
default
除外),并使用第一个匹配项。
但是,再次强调,不要这样做。 :-D
您也可以考虑查找表:
// Creates a key for the two colors, where the colors are always
// in lexicographical order (so we don't have to worry about the
// argument order)
const colorKey = (color1, color2) => color1 < color2 ? color1 + "\t" + color2 : color2 + "\t" + color1;
const colorMix = new Map([
[colorKey("blue", "red"), "violet"],
[colorKey("red", "yellow"), "orange"],
[colorKey("blue", "yellow"), "green"],
]);
// ...
function colorMix (color1, color2){
const color = colorMix.get(colorKey(color1, color2));
return color ?? "need to mix two diferent colours";
}
表达式
(color1, color2)
的计算结果为 color2
,因为逗号在这里是一个 运算符。所以这对于 switch
声明没有用。
使其发挥作用的一种方法是将颜色字符串转换为颜色数字,这样主颜色(红色,黄色和蓝色)是2的幂。如果它们加在一起(或者更好OR 在一起),找到其他颜色编号。
具体方法如下:
const colorNames = ["none", "red", "yellow", "orange", "blue", "violet", "green", "black"];
const colorNums = Object.fromEntries(colorNames.map((name, i) => [name, i]));
const colorMix = (color1, color2) => colorNames[colorNums[color1] | colorNums[color2]];
console.log(colorMix("blue", "red")); // violet
// Order does not matter
console.log(colorMix("red", "blue")); // violet
// Mixing a color with itself does not change it
console.log(colorMix("orange", "orange")); // orange
// Can mix an already mixed color again
console.log(colorMix("violet", "yellow")); // black
const colorNames = ["none", "red", "yellow", "orange", "blue", "violet", "green", "black"];
这里我们创建一个颜色名称数组。名称在此数组中出现的 index 是其唯一标识符。主要颜色位于 2 的幂的索引上:1、2 和 4。如果我们将索引写为二进制数,则上面的数组如下所示:
二进制索引 | 颜色名称 |
---|---|
000 | 无 |
001 | 红色 |
010 | 黄色 |
011 | 橙色 |
100 | 蓝色 |
101 | 紫罗兰 |
110 | 绿色 |
111 | 黑色 |
该数组可用于给出与索引相对应的颜色名称。请注意“橙色”(011) 如何组合“红色”(001) 和“黄色”(010) 的二进制位,当任一混合颜色在二进制的相同位置具有“1”时,取“1”代表。
以下语句创建反向映射(从名称到索引):
const colorNums = Object.fromEntries(colorNames.map((name, i) => [name, i]));
.map()
创建名称和索引对(上表,但交换了列)。 Object.fromEntries
使用此信息创建一个普通对象:
{
none: 0,
red: 1,
yellow: 2,
orange: 3,
blue: 4,
violet: 5,
green: 6,
black: 7
}
有了这两个转换对象,我们现在可以制作一个漂亮的混色器功能:
const colorMix = (color1, color2) => colorNames[colorNums[color1] | colorNums[color2]];
使用
colorNums
将两种颜色分别转换为其数字。
这两个数字使用二元或运算符 (
|
) 组合。这将给出我们想要获得的颜色的数量。
最后,使用
colorNames
数组将该值转换回颜色名称。
脚本的其余部分说明了如何调用该函数:
这里我使用按位添加颜色,所以无论顺序如何,它们总是会生成一个唯一的ID,使用开关我检查颜色ID,它是两种颜色的ID之和。
function getColorIndex(color1, color2) {
const colors = {
"red": 1,
"blue": 2,
"yellow": 4 // next will be the double (n * 2) e.g: "violet": 8
}
return color1 !== color2 ? colors[color1] | colors[color2] : -1;
}
function colorMix (color1, color2) {
switch (getColorIndex(color1, color2)) {
case 3: // red + blue (1 + 2 === 3)
return "violet";
case 5: // red + yellow (1 + 4 === 5)
return "orange";
case 6: // blue + yellow (2 + 4 === 6)
return "green";
case -1: // getColorIndex will return -1 if colors are equal
return "need to mix two diferent colours";
default:
return `Unrecognized colors: ${color1} + ${color2}`;
}
}
let myColor = colorMix('blue', 'blue');
console.log(`The color created is: ${ myColor}`);
myColor = colorMix('omg', 'idk');
console.log(`The color created is: ${ myColor}`);
myColor = colorMix('red', 'yellow');
console.log(`The color created is: ${ myColor}`);
您可以获取数组中的所有颜色并对它们进行排序,然后使用标准化顺序进行检查,而不是使用
switch
语句进行过多比较。
function colorMix(...colors) {
colors.sort();
if (color[0] === 'blue' && color[1] === 'red') return 'violet';
if (color[0] === 'red' && color[1] === 'yellow') return 'orange';
if (color[0] === 'blue' && color[1] === 'yellow') return 'green';
return 'need to mix two diferent colours';
}
Set
function colorMix(...colors) {
const
mixedColors = {
violet: new Set(['blue', 'red']),
orange: new Set(['red', 'yellow'])
green: new Set(['blue', 'yellow'])
};
return Object.keys(mixedColors).find(c => colors.every(Set.prototype.has, mixedColors[c]))
|| 'need to mix two diferent colours';
}
最后一个没有状态,只有一个访问器
function colorMix(...colors) {
const mixed = {
blue: { red: 'violet', yellow: 'green' },
red: { yellow: 'orange' }
}
colors.sort();
return mixed[colors[0]]?.[colors[1]] ||'need to mix two diferent colours';
}
let c1 =提示(“输入颜色1:”); 让c2 =提示(“输入颜色2:”);
switch (c1.toLowerCase() + c2.toLowerCase()) { 案例“红蓝”: 案例“蓝红”: console.log("紫色"); 打破;
case "redyellow":
case "yellowred":
console.log("Orange");
break;
case "blueyellow":
case "yellowblue":
console.log("green");
break;
default:
console.log("Unknown color combination");
break;
}