Как гарантировать, что подстроки возвращаются в правильный индекс строки после первоначального удаления в javascript? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть строка, которая выглядит следующим образом:

query = "I learned to =play the 'Ukulele' in 'Lebanon'."

Как видите, в ней есть некоторые специальные символы, такие как =, ', которые я хочу удалить изначально.

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

specialCharIndexMapping {
  ',': [],
  "'": [ 23, 31, 36, 44 ],
  '"': [],
  '=': [ 13 ],
  '>': [],
  '<': []
}

Как видите, одинарная кавычка ' появилась в индексах 23, 31, 26, 44 и равна =, появилась в индексе 13.

Теперь я удаляю специальные символы из строки

query = query.replace(/"/g,"").replace(/'/g,"").replace(/=/g,"").replace(/>/g,"").replace(/</g,"").replace(/,/g,"");

Так что теперь мой запрос выглядит следующим образом

query = I learned to play the Ukulele in Lebanon.

Теперь мне нужно поместить эти специальные символы обратно в мою строку на основе информации индекса. Вот что я делаю

for (char in specialCharIndexMapping) {
        if(specialCharIndexMapping[char] !== []) {
            charIndices = specialCharIndexMapping[char]
            for(i=0; i<charIndices.length; i++) {
                index = charIndices[i]
                //query = query.substr(0, index) + char + query.substr(index);
                query = query.slice(0, index) + char + query.slice(index);
            }
        }
    }
    console.log(query)
}

Но персонажи возвращаются не в те места. Вот как выглядит моя последняя строка

query = "I learned to =play the U'kulele 'in L'ebanon.'"

Потратив некоторое время, я понял, что это может быть связано со смещением строки из-за введения новых символов. Таким образом, последующие индексы не сохранятся. Поэтому я попытался сделать что-то ниже

for (char in specialCharIndexMapping) {
        if(specialCharIndexMapping[char] !== []) {
            charIndices = specialCharIndexMapping[char]
            for(i=0; i<charIndices.length; i++) {
                if (i==0) {
                  index = charIndices[i]
                }
                else {
                    index = charIndices[i] -1
                }
                //query = query.substr(0, index) + char + query.substr(index);
                query = query.slice(0, index) + char + query.slice(index);
            }
        }
    }
    console.log(query)
}

Я в основном продолжаю уменьшать позицию индекса на 1, за исключением первой замены. Это намного ближе к исходной строке, но все равно не так. Вот как это выглядит сейчас

query = "I learned to =play the U'kulele' in 'Lebanon'."

Как мне обеспечить замену специальных символов в соответствующих местах и ​​вернуть исходную строку?

1 Ответ

1 голос
/ 28 апреля 2020

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

// !WARNING: This code uses ES6 (ECMA2015+) syntax
const query = "I learned to =play the 'Ukulele' in 'Lebanon'.";
const charToRemove = [',', "'", '"', '=', '>', '<'];

const foundPositions = []
// Loop over all letters and save their respective position and their character
const cleanedQuery = query.split('').map((char, index) => {
  if (charToRemove.includes(char)) {
    foundPositions.push([index, char]);
    // Return an empty string to remove the character
    return '';
  } else {
    return char;
  }
}).join('');

console.log('cleanedQuery', cleanedQuery);
console.log("savedPositions", foundPositions);

// Loop over found characters to put them back into place
const rebuiltQuery = foundPositions.reduce((acc, pair) => {
  const [
    index,
    char
  ] = pair;
  acc.splice(index, 0, char);
  return acc;
}, cleanedQuery.split('')).join('');

console.log("originalQuery", rebuiltQuery);
console.log('query and originalQuery are the same:', (query === rebuiltQuery).toString());
...