javascript - 如果给定多个“案例”,我如何修改先前修改的变量而不是连接到它?
问题描述
我的代码工作正常,直到插入超过 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"]));
解决方案
将相同的变量传递给您在调用它们时重新分配的函数。设置finalCase
为 的初始值input
,然后将所有出现的 更改input
为finalCase
:
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
请注意,您应该从i
0 开始,而不是 -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"))
推荐阅读
- python - 在TensorFlow中读取与mnist数据集相同格式的新数据集
- ruby - 如何遍历嵌套数组/哈希并从那里检索数据
- mysql - col LIKE BINARY 'val%' 比 col LIKE 'val%' 慢得多。为什么?
- r - 两个物种的离散时间竞争 - 用向量实现但坚持矩阵
- gremlin - 如何在janusgraph中的顶点上设置属性值?
- java - JAVA - Selenium WebDriver - 断言和等待
- awk - 从 CMake execute_process 内部运行 awk
- java - 如何在android studio中修复“无法解析符号'app'”?
- javascript - 如何在 Semantic-UI-React 下拉菜单中选择图像?
- php - 通过另一个表的 ID 从一个表中获取值