首页 > 解决方案 > 如果给定多个“案例”,我如何修改先前修改的变量而不是连接到它?

问题描述

我的代码工作正常,直到插入超过 1 个“案例”,它只是覆盖了前一个案例。

例如。console.log(makeCase("this is a string", ["upper", "snake"])); 当它应该是“THIS_IS_A_STRING”时变成“this_is_a_string”

我希望能够保存新结果,因此如果有多个“案例”,它会修改新字符串而不是修改原始字符串。因此代码将原始字符串更改为 THIS IS A STRING,然后再次将其变为 THIS_IS_A_STRING。

我也将开关分开,因为部分任务涉及到:

/* 每种大小写样式的优先级如下,列表中较高的值应首先处理:

骆驼, 帕斯卡, 蛇, 烤肉串, 标题

元音辅音

上、下 */

谢谢你的帮助。

const makeCase = function (input, cases) {
  let finalCase = "";
  for (let i = -1; i < cases.length; i++) {
    switch (cases[i] || cases) {
      case "pascal":
        finalCase = pascalCase(input);
        break;
      case "camel":
        finalCase = camelCase(input);
        break;
      case "snake":
        finalCase = snakeCase(input);
        break;
      case "kebab":
        finalCase = kebabCase(input);
        break;
      case "title":
        finalCase = titleCase(input);
        break;
    }
    switch (cases[i] || cases) {
      case "vowel":
        finalCase = vowelCase(input);
        break;
      case "consonant":
        finalCase = consonantCase(input);
        break;
    }
    switch (cases[i] || cases) {
      case "upper":
        finalCase = upperCase(input);
        break;
      case "lower":
        finalCase = lowerCase(input);
        break;
    }
  }

  return finalCase;

}


console.log(makeCase("this is a string", ["upper", "snake"]));

标签: javascript

解决方案


将相同的变量传递给您在调用它们时重新分配的函数。设置finalCase为 的初始值input,然后将所有出现的 更改inputfinalCase

const makeCase = function (input, cases) {
  let finalCase = input;
  for (let i = 0; i < cases.length; i++) {
    switch (cases[i] || cases) {
      case "pascal":
        finalCase = pascalCase(finalCase);
        break;
      case "camel":
        finalCase = camelCase(finalCase);
        break;
  // etc

请注意,您应该从i0 开始,而不是 -1(因为cases[i]不存在)。

创建一个函数对象可能会更优雅,然后您可以使用括号表示法访问该函数对象,然后使用它reduce来迭代案例数组,通过在对象上为数组的每个元素调用适当的函数来转换字符串:

const fns = {
  pascal: pascalCase,
  camel: camelCase,
  snake: snakeCase,
  // ...
};
const makeCase = function(input, transforms) {
  return transforms.reduce((lastStr, transform) => fns[transform](lastStr), input);
}

现场示例:

const fns = {
  upper: str => str.toUpperCase(),
  snake: str => str.replace(/ /g, '_'),
};
const makeCase = function(input, transforms) {
  return transforms.reduce((lastStr, transform) => fns[transform](lastStr), input);
}

console.log(makeCase("this is a string", ["upper", "snake"]))

当数组中只有一个案例时,另一个活生生的例子:

const fns = {
  upper: str => str.toUpperCase(),
  snake: str => str.replace(/ /g, '_'),
};
const makeCase = function(input, transforms) {
  return transforms.reduce((lastStr, transform) => fns[transform](lastStr), input);
}

console.log(makeCase("this is a string", ["upper"]))

如果要应用的转换输入可能是字符串,而不仅仅是数组,则首先检查参数是否为数组:

const fns = {
  upper: str => str.toUpperCase(),
  snake: str => str.replace(/ /g, '_'),
};
const makeCase = function(input, transforms) {
  return Array.isArray(transforms)
    ? transforms.reduce((lastStr, transform) => fns[transform](lastStr), input)
    : fns[transforms](input);
}

console.log(makeCase("this is a string", "upper"))


推荐阅读