var string = "Please click on dashboard and then open the dashboard details to verify your details on the data";
var stringArray = ["dashboard" , "dashboard" , "data"]
var replaceArray = ["https://abcd.com/login" , "https://abcd.com/home" , "https://abcd.com/data"]
for(i=0;i<stringArray.length; i++){
    string = string.replace(stringArray[i].trim(), "<a href='"+replaceArray[i].trim()+"'>"+stringArray[i].trim()+"</a>");
}

我有一个字符串和两个数组,如上图所示.我需要用两个数组中提到的相应锚链接标记替换我的字符串.stringArray定义要链接的单词,replaceArray定义应添加的URL.与第一次出现的仪表板一样,应锚定链接到"https://abcd.com/login第二次出现的"dashboard"应替换为"https://abcd.com/home"和"数据"应替换为"https://abcd.com/data".

我试图找出字符串中的单词,并使用replace/replaceAll替换它,对于单次出现的单词效果很好,但对于多次出现的单词,它不起作用.

谁能帮我解决这个问题.

结果:

"Please click on <a href='https://abcd.com/login'><a href='https://abcd.com/home'>dashboard</a></a> and then open the dashboard details to verify your details on the <a href='https://abcd.com/data'>data</a>"

Expected Output:

"Please click on <a href='https://abcd.com/login'>dashboard</a> and then open the <a href='https://abcd.com/home'>dashboard</a> details to verify your details on the <a href='https://abcd.com/data'>data</a>"

推荐答案

当使用字符串作为Javascript replace函数的第一个参数(子字符串)时,replace将只查找并替换第一个出现的子字符串.这就是为什么"登录"和"主页"链接都嵌套在第一个出现的"dashboard"周围,而其余出现的"dashboard"保持不变.使用regular expression as the first parameter是一种解决方案,但不是唯一的解决方案...

使用indexOf()跟踪最后一个索引,其中匹配了数组strArray中的单词,然后slice在最后一次插入后对字符串进行加密,以从那里继续替换搜索:

var string = "Please click on dashboard and then open the dashboard details to verify your details on the data";
var stringArray = ["dashboard", "dashboard", "data"]
var replaceArray = ["https://abcd.com/login", "https://abcd.com/home", "https://abcd.com/data"]

// keep track of last position of matched string
let ii = 0;

for (i = 0; i < stringArray.length; i++) {
  let str = stringArray[i].trim();
  let repstr = '<a href="' + replaceArray[i].trim() + '">' + str + '</a>';

  // move position to index of matched string
  ii += string.slice(ii).indexOf(str);
  string = 
    // this is the portion of string before and including last replacement
    string.slice(0, ii) 
    // this is the portion after last replacement
    + string.slice(ii).replace(str, repstr);

  // move position to past current replacement
  ii += repstr.length;
}
console.log(string);
// Please click on <a href="https://abcd.com/login">dashboard</a> and then open the <a href="https://abcd.com/home">dashboard</a> details to verify your details on the <a href="https://abcd.com/data">data</a>


下面是一个将单词和链接组合到单个数组中的解决方案,然后使用reduce迭代数组replace_arr,更新字符串string,并维护匹配索引ii:

let string = "Please click on dashboard and then open the dashboard details to verify your details on the data";
const replace_arr = [["dashboard", "https://abcd.com/login"], ["dashboard", "https://abcd.com/home"], ["data", "https://abcd.com/data"]];

replace_arr.reduce(
  (ii, [str, link]) => {
    let repstr = '<a href="' + link + '">' + str + '</a>';
    ii += string.slice(ii).indexOf(str);
    string = string.slice(0, ii) 
      + string.slice(ii).replace(str, repstr)
    return ii + repstr.length;
  }
  , 0
);

console.log(string);
// Please click on <a href="https://abcd.com/login">dashboard</a> and then open the <a href="https://abcd.com/home">dashboard</a> details to verify your details on the <a href="https://abcd.com/data">data</a>


与每次迭代从外部访问字符串到简化过程相比,重构的简化方法最初在reduce()函数中包含string,并在内部进行处理,可将执行时间减少近一半:

let string = "Please click on dashboard and then open the dashboard details to verify your details on the data";
const replace_arr = [["dashboard", "https://abcd.com/login"], ["dashboard", "https://abcd.com/home"], ["data", "https://abcd.com/data"]];

[string] = replace_arr.reduce(([ss, ii], [str, link]) => {
  let repstr = '<a href="' + link + '">' + str + '</a>';
  ii += ss.slice(ii).indexOf(str);
  return [ss.slice(0, ii) +
    ss.slice(ii).replace(str, repstr), ii + repstr.length
  ];
}, [string, 0]);

console.log(string);
// Please click on <a href="https://abcd.com/login">dashboard</a> and then open the <a href="https://abcd.com/home">dashboard</a> details to verify your details on the <a href="https://abcd.com/data">data</a>

Javascript相关问答推荐

JS生成具有给定数字和幻灯片计数的数组子集

一次仅播放一个音频

Redux工具包查询(RTKQ)端点无效并重新验证多次触发

每次子路由重定向都会调用父加载器函数

jQuery提交按钮重新加载页面,即使在WordPress中使用preventDefault()

Angular 17—每当一个布尔变量变为真时触发循环轮询,只要它保持为真

如何将Cookie从服务器发送到用户浏览器

400 bad request error posting through node-fetch

如何将zoom 变换应用到我的d3力有向图?

如何在 Select 文本时停止Click事件?

为什么我的按钮没有从&q;1更改为&q;X&q;?

如何利用CSS中的隐藏元素实现平滑扩展和防止网格行间隙

无法避免UV:flat的插值:非法使用保留字"

如何在AG-Grid文本字段中创建占位符

Clip-Path在网页浏览器(Mozilla、Edge、Chrome)上不能正常工作,但在预览版Visual Code Studio HTML、CSS、JS上却能很好地工作

我怎样才能得到一个数组的名字在另一个数组?

select 2-删除js插入的项目将其保留为选项

如何在Reaction中设置缺省值, Select 下拉列表,动态追加剩余值?

如何从Reaction-Redux中来自API调用的数据中筛选值

如果我将高度设置为其内容的100%,则在Java脚本中拖动以调整面板大小时会冻结