2017-08-26 138 views
3
let string = 'My name is [~FIRSTNAME] [~LASTNAME]'; 
let nameArray = ['Peter', 'Parker']; 
let patternToBeReplaced = ['[~FIRSTNAME]', '[~LASTNAME]'] 

我想更换stringnamearray使带子变得'My name is Peter Parker'用数组元素替换字符串

下面的元素是我的方法解决这个问题 -

patternToBeReplaced.forEach(function (match, index) { 
     var output = string.replace(match, nameArray[index]); 
}); 

但是,这是不按预期工作。

+2

你需要更新字符串变量....但让块级范围......所以用箭头函数来代替 –

+0

是,' string = string.replace(...' – James

+0

尝试使用'reduce'而不是'forEach' – Bergi

回答

4

你可以使用Array#reduce和使用字符串下一个替代品。

let string = 'My name is [~FIRSTNAME] [~LASTNAME]'; 
 
let nameArray = ['Peter', 'Parker']; 
 
let patternToBeReplaced = ['[~FIRSTNAME]', '[~LASTNAME]'] 
 

 
string = patternToBeReplaced.reduce((s, m, i) => s.replace(m, nameArray[i]), string); 
 

 
console.log(string);

1
patternToBeReplaced.forEach(function (match, index) { 
    string = string.replace(match, nameArray[index]); 
}); 
2

您正在创建字符串模板系统。由于您已经使用ECAMScript 6语法,因此您可以使用新的内置模板文字。

let [FIRSTNAME, LASTNAME] = ['Peter', 'Parker']; 
 
let string = `My name is ${FIRSTNAME} ${LASTNAME}`; 
 

 
console.log(string);


这也将工作当有字符串中的给定标签的多个插入更干净。

let [FIRSTNAME, LASTNAME] = ['Peter', 'Parker']; 
 
let string = `My name is ${LASTNAME}... ${FIRSTNAME} ${LASTNAME}`; 
 

 
console.log(string);

0

类似的东西。

let str = 'My name is [~FIRSTNAME] [~LASTNAME]'; 
 
let nameArray = ['Peter', 'Parker']; 
 
let patternToBeReplaced = ['[~FIRSTNAME]', '[~LASTNAME]'] 
 

 

 
const result = patternToBeReplaced.reduce((str, placeholder, i) => { 
 
return str.replace(placeholder, nameArray[i]); 
 
}, str); 
 
console.log(result);

0
  1. output是一个局部变量,这是没用的,只是宣称它。
  2. replace(String, String)只会替换第一个匹配的模式。

这里是我的解决方案:

let replaceWithArrayElements = (patterns, replacements, targetString) => { 
    patterns.forEach((pattern, i) => targetString = targetString.replace(new RegExp(pattern, 'g'))); 
    return targetString; 
} 
0

首先解决方案,让您的基本代码:

let string = 'My name is [~FIRSTNAME] [~LASTNAME]'; 
let nameArray = ['Peter', 'Parker']; 
let patternToBeReplaced = ['[~FIRSTNAME]', '[~LASTNAME]']; 
patternToBeReplaced 
.forEach((match, i)=>{ 
    string = string 
      .replace(match, nameArray[i]); 
}); 

使用Map

let string = 'My name is [~FIRSTNAME] [~LASTNAME]'; 
let replaceMap = new Map(); 
replaceMap.set('[~FIRSTNAME]', 'Peter'); 
replaceMap.set('[~LASTNAME]', 'Parker'); 
replaceMap.forEach((key, value)=>{ 
    string = string.replace(key, value); 
}); 

使用ES6 “模板” 字符串:

/* 
*Have some ways of getting the first name in "firstName" 
*Have some ways of getting the last name in "lastName" 
*/ 
let string = `My name is ${firstName} ${lastName}`; 
0
string.match(/\[~\w+\]/g).forEach((item,index)=>{ 
    string = string.replace(item, nameArray [index]) 
}) 

您可以使用上面的代码你需要