Как заменить слова в предложении с его значениями в JavaScript? - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть следующее scenerio, где у меня есть следующая строка

Edit:  const message = results.doc.data().taskSettings.taskInProgressSettings.pushNotifications.onAssignmentNotifyEmployee.message;

Я получаю сообщение от db, а переменные не обязательно taskId , customerName. Это может быть taskId , customerName , customerId, taskCreaterName , employeeName , employeeId. Сообщение может содержать любые из перечисленных выше переменных, и мне нужно заменить их во время выполнения на значения.

message:`Task ${taskId} assigned by ${taskCreaterName} for customer ${customerName}`
let taskId = T-100;
let taskCreaterName = 'mark';
let customerName = 'henry';

и я хочу заменить переменные (taskId, taskCreaterName, customername) на их значения, и окончательный результат должен быть следующим,

newMessage = Task T-100 assigned by mark for customer henry

Что было бы лучшим способом достижения этого. Спасибо

Ответы [ 6 ]

0 голосов
/ 14 ноября 2018

Вы можете использовать String#replace с пользовательским обратным вызовом и eval (name содержит только символы [a-zA-z0-9], поэтому это должно быть безопасно)

var message = 'Task ${taskId} assigned by ${taskCreaterName} for customer ${customerName}';
let taskId = 'T-100';
let taskCreaterName = 'mark';
let customerName = 'henry';

var newMessage = message.replace(/\${([\w]+)}/g, function(match, name){
  return eval(name);
})

console.log(newMessage);
0 голосов
/ 14 ноября 2018

Чтобы сделать эту работу универсальным образом, вы можете сохранить 1 объект (например, «withData», который я создал ниже, вместо сохранения различных переменных) для хранения значений для замены и позволить универсальной функции (replace) позаботиться обо всех изменениях, как показано ниже

let message = 'Task ${taskId} assigned by ${taskCreaterName} for customer ${customerName}'

let withData = {
  taskId: 'T-100'
  , taskCreaterName: 'mark'
  , customerName: 'henry'
}

function replace(obj, withData) {
  let result = message.slice(0)
  for (let [key, value] of Object.entries(withData)) {
    result = result.replace('${' + key + '}', value)
  }
  
  return result
}

let result = replace(message, withData)

console.log(result)

// In case Object.entries is not supported
function replace(obj, withData) {
  let result = message.slice(0)
  for (let key in withData) {
    let value = withData[key]
    result = result.replace('${' + key + '}', value)
  }
  
  return result
}
0 голосов
/ 14 ноября 2018

В зависимости от значения T в вашем коде, которое вы не предоставили, я буду считать, что оно содержит действительное целое число.

let T = parseInt(Math.random() * 1000);

let taskId = T-100;
let taskCreaterName = 'mark';
let customerName = 'henry';

//assuming T-100 is a result of an expression, you would do something like:
console.log(`Task ${taskId} assigned by ${taskCreaterName} for customer ${customerName}`);

//assming T-100 is a litral string, then you don't need to parse it at all
console.log(`Task T-100 assigned by ${taskCreaterName} for customer ${customerName}`);
0 голосов
/ 14 ноября 2018

Это, наверное, самый простой способ выполнить то, что вы ищете:

let taskId = 'T-100';
let taskCreaterName = 'mark';
let customerName = 'henry';

let newMessage = 'Task ' + taskId + ' assigned by ' + taskCreaterName + ' for customer ' + customerName;

Где newMessage имеет «Задачу T-100, назначенную знаком для Генри клиента».

0 голосов
/ 14 ноября 2018

Вы можете сохранить значения с целевыми именами в объекте и использовать .replace() для замены целевой части строки значениями в объекте.Если в объекте существует значение с совпадающим именем, замените его значением.

var message = 'Task ${taskId} assigned by ${taskCreaterName} for customer ${customerName} and ${newVar}';
var values = {
  taskId: 'T-100',
  taskCreaterName: 'mark',
  customerName: 'henry'
};
var newStr = message.replace(/\$\{(\w+)\}/g, function(match, cont){
  return typeof values[cont] !== 'undefined' ? values[cont] : match;
})
console.log(newStr);
0 голосов
/ 14 ноября 2018

Вам не нужно ничего делать. Js заменит переменные значением во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...