Вставка нескольких строк в строку без корректировки на изменения индекса - PullRequest
1 голос
/ 18 февраля 2020

У меня есть следующая загадка: у меня есть массив пар индексов строки, в которые должен быть вставлен один символ (третий элемент в подмассивах) (обратите внимание, что эти пары могут быть дубликатами), например,

let arr = [[0, 6, "7"], [0, 6, "h"], [2, 10, "2"], [12, 17, "j"]];

let my_string = "This is a very important string";

for (let i = 0; i < arr.length; i++) {
  // magic code
}

// => my_string now equals "7hth2is i7hs a 2vejry imjportant string";

Я не могу просто вставить символ в каждый индекс, потому что следующая пара индексов в массиве устареет из-за того, что предыдущая пара индексов изменила строку и, таким образом, вызвала ее иметь новые индексы для каждого символа.

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

ПРИМЕЧАНИЕ : массив сортируется в порядке от наименьшего второго индекса в паре к наибольшему, как показано выше. Это можно изменить. Однако массив всегда будет содержать пары индексов, т. Е. Я не могу сгладить массив только по индексам, поскольку третьим элементом массивов является символ, который я хочу вставить.

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

Как бы я вставил символы в каждом индексе в массив пар пар индекса?

Заранее благодарим за любую помощь.

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Вместо цикла по массиву вы можете l oop через строку.

let arr = [[0, 6, "7"], [0, 6, "h"], [2, 10, "2"], [12, 17, "j"]];

let my_string = "This is a very important string";

let str2 = ''
for (let i = 0; i < my_string.length; i++) {
  str2 += arr.filter(x => x.includes(i))
             .reduce(( total, current) => total + current[2],'') + my_string[i];
}

console.log(str2);

filter будет хранить эти элементы в arr, который содержит текущий индекс (i) для l oop.

Если вывод filter не пуст, тогда reduce объединит все свои 3-ий элементы. Наконец, текущий my_string элемент добавляется в конце.

Если вывод filter пуст, reduce ничего не будет делать, поэтому только текущий символ в my_string объединяется с str2.

Результат:

7hTh2is i7hs a 2vejry imjportant string
1 голос
/ 18 февраля 2020

Вы можете создать объект показателей, содержащий строки, где каждый строковый элемент указывает строку, которая будет вставлена ​​в этот индекс. Например, из

[[0, 6], [0, 6], [2, 10]]

и массива символов для вставки ['x', 'y', 'z'], конструируйте

{
  0: 'xy',
  2: 'z',
  6: 'xy',
  10: 'z'
}

Тогда вы можете использовать регулярное выражение для сопоставления с любой позицией (без сопоставления с любыми символами) и используйте его функцию обратного вызова для поиска текущего индекса объекта и замените все символы в этой точке (если есть):

let arr = [[0, 6, "7"], [0, 6, "h"], [2, 10, "2"], [12, 17, "j"]];
const obj = {};
for (const [left, right, char] of arr) {
  obj[left] = (obj[left] || '') + char;
  obj[right] = (obj[right] || '') + char;
}
const my_string = "This is a very important string";

console.log(
  my_string.replace(
    /(?:)/g,
    (_, index) => obj[index] || ''
  )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...