Javascript - 循环对象并使用键/值来执行文本替换

时间:2012-02-22 06:57:27

标签: javascript jquery loops

我正在开发一个接收以这种方式组织的对象的函数: {“oldID1”:“newID1”,“oldID2”:“newID2”,...}

此信息将被输入到另一个函数中,该函数将在包含这些ID的textarea中执行带有newID1,newID2和newID2等的oldID1的字符串替换。

此初始对象最初来自一系列排序操作,使得对象键表示列表的原始顺序,对象值表示新排序的顺序。因此,举例来说,我会面对一个看起来像这样的对象:

{
"1":"3",
"2":"1",
"3":"2",
"4":"4"
}

意图是将第3项移至列表顶部。因此,对于单独的文本区域中的文本,1应该被替换为3,2乘1和3乘2.

当我尝试迭代对象并执行替换时,我遇到了问题,因为一些文本被多次替换。因此'1'被'3'取代,但后来被'2'取代。

以下是我用于遍历该对象的代码:

$.each(the_object, function(key, value){   
      replace_text(key,value);
});

function replace_text(old_id, new_id){
    var textarea        = $("#the_textarea");
    var str             = textarea.val();
    var replace_regex   = new RegExp("<pic_"+old_id+">");
    str = str.replace(replace_regex, '<pic_'+new_id+'>');
    the_textarea.val(str);
}

我应该强调,排序过程与文本替换无关。考虑到我拥有的对象,我只关心找到执行文本替换的最佳方法。

提前致谢

2 个答案:

答案 0 :(得分:3)

鉴于您包含ID的对象名为idObj并且在传递给replace的函数的闭包中可用,我想这应该有效:

var textarea = $('#the_textarea');
textarea.val(function(i,str){
  return str.replace(/<pic_(.*?)>/g,
     function(m,n){ 
       return '<pic_' + (idObj[n] || n) + '>';
     });
});

这里的n变量将包含旧索引。我看到idObj的属性以旧索引命名,因此可以像var newIndex = idObj['oldIndex];一样检索新索引,并且函数将返回任何给定的旧索引。

答案 1 :(得分:1)

问题很明显。

对于键“1”,“1”被替换为“3”,对于键“3”,“3”被替换为“2”

所以你可以做这样的事情。在功能

var replace_regex   = new RegExp("<pic_"+old_id+">");
str = str.replace(replace_regex, '<pic_N'+new_id+'>');

然后循环

str = str.replace(/<pic_N/g, '<pic_');

在此处查看演示:http://jsfiddle.net/cJn6w/4/