JavaScript字符串.Replace()不工作 var formatChart={ “[newline]”:“”, “[选项卡]:”, “[空间]:” }; //根据格式化图表格式化字符串 var formatString=函数(字符串) { for(格式图中的var k) { while(string.indexOf(formatChart[k])!=-1) string=string.replace(k,this.formatChart[k]); } 返回字符串; }; var str=“Hello[newline]World[tab]tab[space]Hello[newline]Done”; 警报(格式化字符串(str));

JavaScript字符串.Replace()不工作 var formatChart={ “[newline]”:“”, “[选项卡]:”, “[空间]:” }; //根据格式化图表格式化字符串 var formatString=函数(字符串) { for(格式图中的var k) { while(string.indexOf(formatChart[k])!=-1) string=string.replace(k,this.formatChart[k]); } 返回字符串; }; var str=“Hello[newline]World[tab]tab[space]Hello[newline]Done”; 警报(格式化字符串(str));,javascript,Javascript,上面的代码应该用它们的HTML等价物替换所有出现的“特殊”字符([newline],等等)。但它不起作用 为什么? 您正在字符串中搜索结果值,而不是键。请尝试以下方法: var formatChart = { '[newline]' : '<br />', '[tab]' : '&nbsp;&nbsp;&nbsp;&nbsp;', '[space]' : '&nbsp;' }; // Formats a str

上面的代码应该用它们的HTML等价物替换所有出现的“特殊”字符([newline],等等)。但它不起作用


为什么?

您正在字符串中搜索结果值,而不是键。请尝试以下方法:

var formatChart = {
    '[newline]' : '<br />', 
    '[tab]' : '&nbsp;&nbsp;&nbsp;&nbsp;', 
    '[space]' : '&nbsp;'
}; 


// Formats a string according to the formatting chart
var formatString = function(string)
{
    for (var k in formatChart)
    {
        while (string.indexOf(formatChart[k]) != -1)
            string = string.replace(k, this.formatChart[k]); 
    }
    return string; 
}; 

var str = "Hello[newline]World[tab]Tab[space]Hello[newline]Done"; 
alert(formatString(str)); 
string.indexOf(formatChart[k])!=-1
错误。在对象上迭代时(实际上不应该这样做),
k
值是关键。您需要
string.indexOf(k)!=-1

代替此:

var formatString = function(str)
{
    for (var k in formatChart)
    {
        while (str.indexOf(k) != -1)
            str = str.replace(k, formatChart[k]); 
    }
    return str; 
}; 
试试这个:

while (string.indexOf(formatChart[k]) != -1)

你的功能有一个小错误。替换

while (string.indexOf(k) != -1)


并查看结果

小心,用正则表达式替换javascript中的。这不是你想要做的。通常的方法是使用组合的联接和拆分函数

另外,您正在测试替换的字符串是否首先存在(formatChart[k]),但您希望测试替换的字符串(k)是否在该字符串中

下面是一个示例代码:

while (string.indexOf(k) != -1)
不正确:
while(string.indexOf(formatChart[k])!=-1)


正确:
while(string.indexOf(k)!=-1)
这是一个使用正则表达式的小提琴:

这是一个稍微不同的正则表达式版本。这将转义要替换的对象中的regex字符,因此我们可以使用regex replace函数的全局替换。在括号前面需要两个反斜杠,这样当作为正则表达式传递时,就只剩下反斜杠了

function formatString(str) {
    for (var k in formatChart) {
        str = str.split(k).join(formatChart[k]);
    }

    return str;
}
var formatChart={
“\\[newline\\]”:“
”, “\\[tab\\]”:“, “\\[空格\\]”:“” }; var str=“Hello[newline]World[tab]tab[space]Hello[newline]Done”; 函数格式化字符串(str){ for(格式图中的var i){ str=str.replace(新的RegExp(i,“gi”),formatChart[i]); } 返回(str); }

你可以在这里看到它的作用:

这将导致一个永恒的循环,因为
str
的值永远不会改变。你是什么意思?语句
str=str.replace(k,formatChart[k])修改
str
,不是吗?另外,当我测试它时,它不会循环。代码是
string=str.replace(k,formatChart[k])当我写评论的时候。除了下面的内容,你还需要从
this.formatChart[k]
中去掉
this.
这个
指的是你的formatString函数我很好奇为什么你说你不应该在对象上迭代(假设使用了hasOwnProperty)——否则你怎么在JavaScript中遍历(伪)关联数组呢?
用于。。。在我看来,在
中,循环只对内置对象有害。这是因为内置有许多额外的不需要的属性。例如,数组具有长度。另一方面,对于用户制作的哈希表来说,它是非常宝贵的。你们知道你们在那个里放了什么,只要你们不扩展Object.prototype,你们就不会有任何额外的属性。请注意,正如tomfumb提到的那样,这个特定问题可以通过
hasOwnProperty
解决。不,如果使用字符串作为第一个参数,
replace
方法不适用于正则表达式。此外,如果您使用的是
split
join
,则不应循环。我循环是因为OP希望替换其字符串中的几个子字符串。当您替换了一个子字符串时,它在字符串中不再存在,因此您不必再次尝试替换它。是的,这是真的!我只是复制了问题的结构,但你是对的。我将根据这个编辑我的答案。
function formatString(str) {
    for (var k in formatChart) {
        str = str.split(k).join(formatChart[k]);
    }

    return str;
}
var formatChart = {
    '\\[newline\\]' : '<br />', 
    '\\[tab\\]' : '&nbsp;&nbsp;&nbsp;&nbsp;', 
    '\\[space\\]' : '&nbsp;'
};

var str = "Hello[newline]World[tab]Tab[space]Hello[newline]Done";  

function formatString(str) {
    for (var i in formatChart) {
        str = str.replace(new RegExp(i, "gi"), formatChart[i]);
    }
    return(str);
}