Discord. js - Как использовать <string>.replace () и заменять значения? - PullRequest
0 голосов
/ 01 августа 2020

Итак, я задал сегодня вопрос и получил ответ, который вроде сработал. Однако я не совсем знаю, как расширить код ...?

У меня есть слова в массиве и я выбираю случайное слово из указанного массива. Отдельные слова, без пробелов и специальных символов.

const words = [ 'energy',
    'oslo',
    'mother',
    'scanner',
    'summertime'
];
let num = getRandomInt(word.length-1);
let text = word[num];
let asterisc = conv(text); //this turns fex. summertime to - - - - - - - - - - 
// which is formatted for Discord: '**-** **-** **-** **-** **-** **-** **-** **-** **-** **-** '

/*
To try and convert back, I use:
*/

let reveal = revealChar(letter, text, asterisc);

//If the word was: business and I gave the letter e, I get: -e- - - - - - -
//It matches the e, but it's far from correct.
//I want: **-** **-** **-** **-** **-** **e** **-** **-** 

function conv(convert){
    let data = Array(convert.length+1).join('**-** ');
    return data;
}

function revealChar(chosenletter, original, asterisc){
    //This is the code I received from the first question, but I was not accurate enough in what I wanted to achieve.
    revealChars = asterisc.replace(/./g, (c, i) => original[i] === chosenletter ? chosenletter : c);
    return revealChars;
}

Мой код небрежный (я только учусь кодировать с помощью Discord. js и Node.js), но все работает так, как я хочу к, кроме этой "раскрывающей" части ...

Заранее миллион спасибо за то, что вы нашли время, чтобы прочитать, и, возможно, есть решение для меня!

Ответы [ 2 ]

0 голосов
/ 02 августа 2020

Это просто вопрос сопоставления каждой буквы с комбинацией символов. В этом случае комбинация **-** равна длине 6. В конце концов, чтобы найти позицию в исходной строке, нужно разделить положение по коэффициенту, который в данном случае равен 6.

Самый простой способ использовать для этого регулярное выражение, так как изменить формат просто требуется изменить строку и использовать ее длину для сопоставления с оригиналом.

// This converts example: 'summertime' formatted for Discord: '**-** **-** **-** **-** **-** **-** **-** **-** **-** **-** '

function conv(convert){
    let data = Array(convert.length+1).join('**-** ');
    return data;
}

// This reveals the selected letter in the Discord format.
// Note to map the asterisk for mat to the original word
// is to just use the offset which is a factor of 6 due to the length of '**-** '

function revealChar(chosenletter, original, asterisc){
    revealChars = asterisc.replace(/-/g, function(c, i) {
        let ndx = Math.floor(i/6);
        return original[ndx] === chosenletter ? chosenletter : c;}
       );
    return revealChars;
}

let text = 'energy';

let asterisc = conv(text); 
let reveal = revealChar('e', text, asterisc);

console.log( reveal );
0 голосов
/ 02 августа 2020

Вот код, который я использовал. Это вернет слово в формате, как я ожидал.

function display(text, chars = [], format = char => `**${char === null ? "-" : char}**`, separator = " ") {
    const items = [];
    text.trim().split("").forEach(char => {
        items.push(format(chars.indexOf(char) == -1 ? null : char));
    });
    return items.join(separator);
}
...