Как правильно сравнить заменить слово в массиве?
У меня есть массив со словами и массив объектов с "неправильными словами" и их заменами т.е. правильными словами. Мне нужно найти в массиве неправильное слово и заменить его с учетом локали (переменная locale).
Первый и основной массив выглядит так
let e = ["Строки", "Строчка", "В строке", "На строке", "На донышке"]
Второй массив объектов содержит массив списка плохих слов и правильных, на которые нужно заменить плохие слова в первом массиве.
let o = [{ "ru": "Строка", "en": "String", "wrong": ["В строке", "В строчке"] }, { "ru": "Дно", "en": "Bottom", "wrong": ["На дне", "На донышке"] }]
Есть так же переменная которая определена как
let locale = "ru"
Мне нужно сделать следующее:
Пройтись по всему массиву (е), если в массиве найдено слово из o[*].wrong, то заменить его на o[*][locale] в основном массиве, должно получиться следующее:
e = ["Строки", "Строчка", "**Строка**", "На строке", "**Дно**"]
Ответы (1 шт):
В исходном массиве wrong изменил всё на lowerCase(), чтобы не париться с регистром (иначе будет заменять только точные совпадения).
let e = ["Строки", "Строчка", "В строке", "На строке", "На донышке"];
let o = [
{ "ru": "Строка", "en": "String", "wrong": ["в строке", "в строчке"] },
{ "ru": "Дно", "en": "Bottom", "wrong": ["на дне", "на донышке"] }
];
let locale = "ru";
for (let i = 0; i < e.length; i++) {
let searching = e[i].toLowerCase();
let obj = o.find( obj => obj.wrong.includes(searching) );
if (obj) e[i] = "**" + obj[locale] + "**";
}
console.log( e );
.includes(элемент) проверяет, есть ли такой элемент в массиве, возвращает true / false.
.find(функция) возвращает первый найденный элемент, для которого вызванная функция вернула true.
Если предстоит много таких замен, можно перестроить структуру o, чтобы сразу взять нужное слово, так:
let e = ["Строки", "Строчка", "В строке", "На строке", "На донышке"];
let o = [
{ "ru": "Строка", "en": "String", "wrong": ["в строке", "в строчке"] },
{ "ru": "Дно", "en": "Bottom", "wrong": ["на дне", "на донышке"] }
];
let locale = "ru";
let o2 = rearrange_o(o);
/* {
* "в строке": {ru: "Строка, en: "String"},
* "в строчке": {ru: "Строка, en: "String"},
* ...
*/
for (let i = 0; i < e.length; i++) {
let wrong_word = o2[ e[i].toLowerCase() ];
if (wrong_word) e[i] = "**" + wrong_word[locale] + "**";
}
console.log( e );
/***/
function rearrange_o(o) {
let result = {};
for (let obj of o) {
let words = {ru: obj.ru, en: obj.en};
// Это чтобы не создавать лишние объекты для каждого слова.
for (let wrong_word of obj.wrong) {
result[wrong_word] = words; // Они будут ссылаться на один и тот же words
}
}
document.body.innerHTML = `<pre>${ JSON.stringify(result, true, 2) }</pre>`;
return result;
}
К слову, помимо массива... wrong может хранить и регулярные выражения) Хотя в сложных комбиранциях слов, с массивами будет легче работать.
let e = ["Строки", "Строчка", "В строке", "На строке", "На донышке"];
let o = [
{ "ru": "Строка", "en": "String", "wrong": /^в строч?ке$/i },
{ "ru": "Дно", "en": "Bottom", "wrong": /^на д(?:н|онышк)е$/i }
];
let locale = "ru";
for (let i = 0; i < e.length; i++) {
let obj = o.find( obj => obj.wrong.test(e[i]) );
if (obj) e[i] = "**" + obj[locale] + "**";
}
console.log( e );