javascript 开关声明:在一个输出中应用多个参数

xkftehaa  于 2023-01-11  发布在  Java
关注(0)|答案(5)|浏览(109)

我试图弄清楚如何将两个不同的条件应用于switch语句中的一个输出。我有一个函数,根据第二个参数得到的参数来设置字符串的样式。第一个和第二个输出是可以的,因为它只有一个样式参数,但第三个输出有。我找不到一种方法来同时应用大写和反转样式到字符串。我'我试图循环一个switch语句。我想知道是否有什么好的解决方法。

function caseStyle(string, style) {
  function toUpper(string) {
    string = string.toUpperCase();
    return string;
  }

  function toReversed(string) {
    string = string.split("").reverse().join("");
    return string;
  }

  switch (style) {
    case "upper":
      string = toUpper(string);
      break;
    case "reversed":
      string = toReversed(string);
      break;
  }
  return string;
}

console.log(caseStyle("hello", "upper")); //output: HELLO
console.log(caseStyle("hello", "reversed")); //output: olleh
console.log(caseStyle("hello", ["upper", "reversed"])); // expected output: OLLEH
iugsix8n

iugsix8n1#

您需要检查style是否为数组,并进行相应的处理
或者,将其强制为数组style = [style].flat(),然后迭代该数组
在传入数组的情况下,.flat()将展平数组
如下

function caseStyle(string, style) {
  style = [style].flat();
  function toUpper(string) {
    string = string.toUpperCase();
    return string;
  }

  function toReversed(string) {
    string = string.split("").reverse().join("");
    return string;
  }
  style.forEach(style => {
    switch (style) {
      case "upper":
        string = toUpper(string);
        break;
      case "reversed":
        string = toReversed(string);
        break;
    }
  });
  return string;
}

console.log(caseStyle("hello", "upper")); //output: HELLO
console.log(caseStyle("hello", "reversed")); //output: olleh
console.log(caseStyle("hello", ["upper", "reversed"])); // expected output: OLLEH
wgmfuz8q

wgmfuz8q2#

可以按以下方式使用switch (true)

function caseStyle(string, style) {
      function toUpper(string) {
        string = string.toUpperCase();
        return string;
      }

  function toReversed(string) {
    string = string.split("").reverse().join("");
    return string;
  }

  switch (true) {
    case style === "upper":
      string = toUpper(string);
      break;
    case style === "reversed":
      string = toReversed(string);
      break;
    case style.includes("upper") && style.includes("reversed"):
      string = toUpper(toReversed(string))
      break;
    default:
       break;
  }
  return string;
}

console.log(caseStyle("hello", "upper"));//output: HELLO
console.log(caseStyle("hello", "reversed"));//output: olleh
console.log(caseStyle("hello", ["upper", "reversed"]));// expected output: OLLEH
bvn4nwqk

bvn4nwqk3#

除了这里一些中肯的答案...
我会提出一个不同的方法:

  • 将内部函数toUppertoReversed移到caseStyle函数之外,没有必要将它们放在那里
  • 使用箭头函数和隐式返回,而不是在方法函数中执行两次(!)str = str...,然后在开关情况下再次执行
  • 将函数分组到一个名为methods的Object中-并将函数命名为与其字符串名称完全相同的名称-references
  • 使用**Array.prototype.reduce()**代替开关情况
  • 不要将String/or/Array逻辑封装到if语句中,而是将第二个数组(btw,重命名为styles,复数)转换为Array,使其始终为Array。此外,通过使用.split(/\W+/)(由一个或多个非单词字符分隔),现在还可以传递类似"upper,reversed"的字符串
  • 由于这个逻辑,您可以解耦methods,并且可以在任何时间点添加更多的methods,并且可以在将来使用您可用的预期方法(转换)名称,例如:caseStyle("hello", ["snake", "capitalize", "reverse"])或更大。
const methods = {
  upper: str => str.toUpperCase(),
  reversed: str => [...str].reverse().join(""),
};

const caseStyle = (str, styles) => {
  if (typeof styles === "string") styles = styles.split(/\W+/);
  return styles.reduce((acc, style) => methods[style](acc), str);
};

console.log(caseStyle("hello", "upper")); //output: HELLO
console.log(caseStyle("hello", "reversed")); //output: olleh
console.log(caseStyle("hello", ["upper", "reversed"])); // expected output: OLLEH
console.log(caseStyle("stack", "reversed upper")); // expected output: KCATS

正如你从上面注意到的,我使用了preferredstring Spread语法[...str]来将String转换为Array,当在一个使用多个码位来表示字形的字符串上使用.split("")时,可能会遇到问题,例如:表情符号:

使用.split("")时出现问题

console.log("ab📆🔞".split(""))

将给予:["a","b","�","�","�","�"]

更好的字符串拆分:使用跨页语法:

console.log([..."ab📆🔞"])

如你所见,表情符号被正确地分割和保存。

fruv7luv

fruv7luv4#

为什么不运行一个简单的for循环呢?你还需要检查输入是否不是数组,如果不是,就把它转换成数组。

function caseStyle(string, styles) {
  function toUpper(string) {
    string = string.toUpperCase();
    return string;
  }

  function toReversed(string) {
    string = string.split("").reverse().join("");
    return string;
  }
  
  if (!(styles instanceof Array)) styles = [styles];
  for (const style of styles) {
    switch (style) {
      case "upper":
        string = toUpper(string);
        break;
      case "reversed":
        string = toReversed(string);
        break;
    }
  }
  return string;
}

console.log(caseStyle("hello", "upper")); //output: HELLO
console.log(caseStyle("hello", "reversed")); //output: olleh
console.log(caseStyle("hello", ["upper", "reversed"])); // expected output: OLLEH
xghobddn

xghobddn5#

总体上我可能不会采用这种方法,但这可能适合您当前的方案;特别是当您控制传递给这些函数的输入“样式”时。

function caseStyle(string, style) {
  function toUpper(string) {
    string = string.toUpperCase();
    return string;
  }

  function toReversed(string) {
    string = string.split("").reverse().join("");
    return string;
  }

  switch (style.toString()) {
    case "upper":
      string = toUpper(string);
      break;
    case "reversed":
      string = toReversed(string);
      break;
    case "upper,reversed":
      string = toUpper(toReversed(string));
      break;

}
  return string;
}

console.log(caseStyle("hello", "upper")); //output: HELLO
console.log(caseStyle("hello", "reversed")); //output: olleh
console.log(caseStyle("hello", ["upper", "reversed"])); // expected output: OLLEH

相关问题