我正在制作一个解密函数,但我被困在需要交换字符串的第二个字母和最后一个字母的位置的部分。 我也尝试过使用替换方法,但我认为应该使用子字符串。
Hello 应该等于 Holle 等
function decipher(str) {
let s = ""
for (let word of str.split(" ")){
let dig = word.match(/\d+/)[0]
word = word.replace(dig, String.fromCharCode(dig))
let secondLetter = word[1]
let lastLetter = word[word.length - 1]
let swapped = word.substring(0,1) + lastLetter + word.substring(2,3) + secondLetter
s += swapped + " "
}
return s
};
let swapped = word.substring(0,1) + lastLetter + word.substring(2,word.length - 1) + secondLetter;
const swap = ([a, b, ...xs]) => [a, xs.pop(), ...xs, b].join('');
// ^^^^^^^^ ^
// |____swapping____|
swap("Hello");
//=> "Holle"
通过解构,您还将支持表情符号(但可能不是字素)之类的东西:
swap("H🌯ll🍣");
//=> "H🍣ll🌯"
交换字符串中的单词:
const decipher = str => str.split(' ').map(swap).join(' ');
decipher("Hello World");
//=> "Holle Wdrlo"
decipher(decipher("Hello World"));
//=> "Hello World"
为什么要解构?
通过索引或(简单)正则表达式读取字符串中的字符可能不适用于多代码点字符,例如(但不限于)表情符号:
"🌯".length;
//=> 2! Not 1.
"🌯".charAt(0);
//=> "\ud83c"! Not "🌯".
考虑这个 swap
函数:
function swap(str) {
var arr = str.split('');
var [a, b] = [arr[1], arr[arr.length-1]];
arr[1] = b;
arr[arr.length-1] = a;
return arr.join('');
}
可以与普通的旧 ASCII 配合使用:
swap("Hello");
//=> "Holle"
表情符号的效果与您预期的不同:
swap("H🌯ll🍣");
//=> "H\udf63\udf2fll\ud83c\ud83c"
function swapSecondAndLastLetter(str) {
// Split the string into a mutable array
let original = str.split('');
original[1] = str[str.length-1];
original[original.length-1] = str[1];
// Join the mutable array back into a string
return original.join('');
}
正则表达式 -(.)(.)(.*)(.)
const str = "Hello";
console.log(swap(str));
function swap() {
return str.replace(/(.)(.)(.*)(.)/, "$1$4$3$2")
}
const swapCharacters = (str, char1, char2)=>{
let a = str.replaceAll(char1, '~')
let b = a.replaceAll(char2, char1)
let c = b.replaceAll('~', char2)
return c
}
console.log(swapCharacters('42,23.5453,6', '.', ',')) //42.23,5453.6
function swapCharacters(str,i,j){
str=str.split("")
[str[i],str[j]]=[str[j],str[i]]
return str.join("")
}
看起来很干净:)