我正在开发一个接收以这种方式组织的对象的函数: {“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);
}
我应该强调,排序过程与文本替换无关。考虑到我拥有的对象,我只关心找到执行文本替换的最佳方法。
提前致谢
答案 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/