为什么我无法在JavaScript字符串中交换字符?

21

我想要交换数组的第一个和最后一个字符,但是JavaScript不让我这样做。我不想使用任何内置函数。

function swap(arr, first, last){
    var temp = arr[first];    
    arr[first] = arr[last];
    arr[last] = temp;
}

你需要使用内置函数。如果您将旧字符串与空字符串连接起来,则JavaScript可能会隐式调用String构造函数,但是没有办法不使用内置函数来进行操作。 - Alex W
6个回答

26

由于字符串是不可变的。

数组表示法只是一种表示法,是 charAt 方法的捷径。你可以使用它来通过位置获取字符,但不能用它来设置字符。

因此,如果你想改变某些字符,你必须将字符串拆分成部分,并从这些部分构建所需的新字符串:

function swapStr(str, first, last){
    return str.substr(0, first)
           + str[last]
           + str.substring(first+1, last)
           + str[first]
           + str.substr(last+1);
}

您也可以将字符串转换为数组:

function swapStr(str, first, last){
    var arr = str.split('');
    swap(arr, first, last); // Your swap function
    return arr.join('');
}

请注意,split方法会对一些语言使用的多字节Unicode字符造成彻底的破坏。 - Jeremy J Starcher
1
在这里尝试一些多字节示例:https://mathiasbynens.be/notes/javascript-unicode - Jeremy J Starcher
2
@DavidDiez 如果你关心这个问题,你可以使用 var arr = [...str] 代替 split - Oriol
1
谢谢 @Oriol!我更喜欢你的第二种方法;我认为它更加健壮,虽然我不确定它是否像第一种解决方案一样高效(我认为它是)。 第一种解决方案没有处理开始和结束索引相同时的情况。 - Antuan
如果第一个和最后一个相同,这个方法将不起作用;如果最后一个是结束索引,它也不会起作用。这是一个糟糕的解决方案,请添加边缘情况。 - amitava mozumder
显示剩余2条评论

3
让我来解释一下我的理解:交换数组中的元素可以像这样进行操作:
var myFish = ["angel", "clown", "mandarin", "surgeon"];
var popped = myFish.pop();
myFish.unshift(popped) // results in ["surgeon", "angel", "clown", "mandarin"]

关于交换字符串的首尾字母,可以使用正则表达式来实现,例如:

"mandarin".replace(/^(\w)(.*)(\w)$/,"$3$2$1")// outputs nandarim ==> m is last character and n is first letter

2
我刚刚在Chrome中运行了你的代码,对我来说似乎工作得很好。确保你传递给“first”和“last”的索引是正确的(记住JavaScript是基于0索引的)。如果仍然无法正常工作,您可能还想尝试使用console.log打印出某些变量并进行调试。

编辑:我没有意识到您正在尝试操作一个字符串;我以为您只是指字符或值的数组。

我的代码


1

在字符串中交换字符需要将字符串转换为数组,然后再将数组转换回字符串:

function swap(arr, first, last){
    arr = arr.split('');    //to array
    var temp = arr[first];    
    arr[first] = arr[last];
    arr[last] = temp;
    arr = arr.join("").toString()    //to string
    return arr;
}

以下用法:
str = "ABCDE"
str = swap(str,1,2)
console.log(str)     //print "ACBDE"

1
function swapStr(str, first, last) {
    if (first == last) {
      return str;
    }

    if (last < first) {
      var temp = last;
      last = first;
      first = temp;
    }

    if (first >= str.length) {
      return str;

    }
    return str.substring(0, first) +
      str[last] +

      str.substring(first + 1, last) +

      str[first] +
      str.substring(last + 1);
  }

0

我希望这段代码能帮助到某些人。

var word =  "DED MOROZ";

var arr = word.split('');

for (var i = 0; i < arr.length/2; i++) {

   var temp = arr[i];

   arr[i] = arr[arr.length - i - 1];

   arr[word.length - i - 1] =  temp;
}

console.log(arr.join(""));

运行这段代码,你的字符将被交换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接