Вставка символа в строку на основе размещения символа в другой строке

У меня есть две строки:

const originalSegments = '[ABC][XYZ][123][789]';

const format = 'X-XX-X';

Мне нужно создать новую строку, в которой тире вставляются между наборами символов в originalSegments на основе размещения разделителей в format.

Каждый набор символов в скобках равен одному символу format,

то есть [*] === X

Желаемый конечный результат:

'[ABC]-[XYZ][123]-[789]'

Я могу получить длину каждой секции в format:

const formatSections = format.split('-');
const formatSectionLengths = formatSections.map(section => section.length);
// => [1, 2, 1]

И количество сегментов в originalSegments:

const originalSegmentsCount = (regexToString.match(/\]\[/g) || []).length + 1;
// => 4

Но я не уверен, что делать дальше.

Array.prototype.reduce() подойдет для этого? Любые советы высоко ценится!

Получение данных из формы с помощью JavaScript - краткое руководство
Получение данных из формы с помощью JavaScript - краткое руководство
Получить данные из формы с помощью JS очень просто: вы запрашиваете элемент формы, передаете его конструктору new FormData() и, наконец, получаете...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
0
0
39
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я бы предложил это решение для вашего случая

const originalSegments = "[ABC][XYZ][123][789]";
//convert all segments to ["ABC","XYZ","123","789"]
const segments = originalSegments.split('[').filter(x => x).map(x => x.split(']')[0]);
const format = 'X-XX-X'
let result = []
let segmentIndex = 0
//loop through format to find X for the replacement
for(let i = 0; i < format.length; i++) {
  const character = format[i]
  //if the current character is X, replace with segment data
  if(character === "X") {
     result.push(`[${segments[segmentIndex]}]`)
     //check the next segment
     segmentIndex++
     continue
  }
  result.push(character)
}

//convert all results to a string
const finalResult = result.join("")

console.log(finalResult)

Я выбираю этот ответ, потому что он чистый и ясный. Большое спасибо!

lane 07.04.2022 12:51

Не за что!~ Я рад, что вы довольны обоими решениями :D

Nick Vu 07.04.2022 12:58

Вот еще один подход:

const text='[ABC][XYZ][123][789]',
  pat='X-XX-X';

let txt=text.replaceAll("][","],[").split(",");
console.log(pat.split("").reduce((a,c)=>
 a + (c==="X"?txt.pop():c)
, ""))

Очень гладко!! Спасибо, что подтвердили, что сокращение может быть вариантом решения моей проблемы. Я выбираю другое предложение в качестве ответа только потому, что я работаю в общей кодовой базе, и этот ответ более удобен для разработчиков. Еще раз спасибо за этот замечательный маленький фрагмент.

lane 07.04.2022 12:52

Интересный вопрос. Другая версия с использованием regex групповых матчей и map

const originalSegments = '[ABC][XYZ][123][789]';
const format = 'X-XX-X';

const segs = originalSegments.match(/(\[[\w]+\])/g);
const output = [...format]
  .map((ch) => (ch === "X" ? segs.shift() : ch))
  .join("");
  
console.log(output)

Другие вопросы по теме