javascript - Păstrează spațiile menționate în formatul șirului


const person = {
  name: 'John',
  middle: 'S',
  last: 'Smith'
}

const format = "{ name } {    middle } { last}";

Parantezele acolade funcționează ca un substitut pentru valori dinamice. De exemplu, {name} va fi înlocuit cu John, {middle} cu S.

Problema cu care mă confrunt este legată de păstrarea spațiilor dintre format. De exemplu, dacă există două spații în {name} {middle}, atunci ieșirea ar trebui să fie John S.

Înlocuiesc elementul de tip placeholder cu valori reale și le combin cu un spațiu simplu, dar va fi întotdeauna static.

const person = {
  name: 'John',
  middle: 'S',
  last: 'Smith'
}

const format = "{ name } {     middle } { last}";

function formatStr(obj, format) {
  return format.match(/\b\w+\b/g).map((s) => person[s]).join(' ');
}

console.log(formatStr(person, format));

Ajutorul ar fi cu adevărat apreciat :)

Răspuns #1

Poți folosi o operațiune .replace, potrivind subșirurile dintre {...} cu un singur cuvânt în interior și înlocuind cu valorile din obiectul person dacă există.

const person = {
  name: 'John',
  middle: 'S',
  last: 'Smith'
}

const format = "{ name } {     middle } { last}";

function formatStr(obj, format) {
  return format.replace(/\{[^\w{}]*(\w+)[^\w{}]*}/g, (x,y) => person[y] ?? x);
}

console.log(formatStr(person, format));

Acesta va păstra toate spațiile și celelalte caractere dintre } și {.

Vezi demo-ul regex. Detalii:

  • \{ - un caracter {
  • [^\w{}]* - zero sau mai multe caractere non-cuvânt diferite de { și }
  • (\w+) - Grupul 1: unul sau mai mulți caractere de tip cuvânt
  • [^\w{}]* - zero sau mai multe caractere non-cuvânt diferite de { și }
  • } - un caracter }.