Я знаю, что мне понадобится пустой, пустой массив и вставить символы из предложения в массив, если они не звездочки.
Я думаю, это поможет мне понять, что делать, когда я действительно хочу перебирать элементы в массиве и использовать их в качестве замен.
function replaceAsterisk(sentence, newWords) {
let newArray = [];
let character = sentence.split("");
console.info(character);
// if the character is not an asterisk, push it into the new array
if (character !== "*") {
newArray.push(character);
}
// if the character is an asterisk, push "cat" into the new array
else {
newArray.push("cat");
}
// return new array as a string
return newArray.join(" ");
}
console.info(replaceAsterisk("My name is * and I am a *.", ["Sabrina", "Black Cat", "extra", "words"]));
Даже сейчас это не пихание "кошки" в массив - почему?
Кроме того, какой результат вы получили от этого кода?
character instanceof Array.
Обратите внимание, что переменная character будет array после split(), и тогда character !== "*" всегда будет истинным. Редко вы не видите это в своей консоли ...
Я не могу использовать return sentence.replace(/"*"/g, "cat"), потому что хочу заменить звездочки на «Сабрина», «Черная кошка», «дополнительно» и «слова».
У вас там цитаты. Удалить их. /\*/g



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Сначала вы должны перебрать все символы, см. пример ниже.
function replaceAsterisk(sentence, newWords) {
let newArray = [];
let character = sentence.split("");
console.info(character);
character.forEach(function(c){
// if the character is not an asterisk, push it into the new array
if (c !== "*") {
newArray.push(c);
}
// if the character is an asterisk, push "cat" into the new array
else {
newArray.push("cat");
}
});
// return new array as a string
return newArray.join("");
}
console.info(replaceAsterisk("My name is * and I am a *.", ["Sabrina", "Black Cat", "extra", "words"]));Вы пропустили ненужное пространство, которое используется в newArray.join(" ");. Это не обязательно, строку можно просто соединить.
Вам нужно перебрать все символы в предложении:
function replaceAsterisk(sentence, newWords) {
let newArray = [];
for( let i = 0; i < sentence.length; i++) { // This line
character = sentence[i];
// if the character is not an asterisk, push it into the new array
if (character !== "*") {
newArray.push(character);
}
// if the character is an asterisk, push "cat" into the new array
else {
newArray.push("cat");
}
}
// return new array as a string
return newArray.join(" ");
}
console.info(replaceAsterisk("My name is * and I am a *.", ["Sabrina", "Black Cat", "extra", "words"]));Используйте String.replace() с функцией, которая генерирует строку замены. В функции получить текущую замену из newWords с помощью счетчика:
function replaceAsterisk(sentence, newWords) {
let counter = 0;
return sentence.replace(/\*/g, () => newWords[counter++] || '');
}
console.info(replaceAsterisk("My name is * and I am a *.", ["Sabrina", "Black Cat", "extra", "words"]));Мне очень нравится эта идея использования счетчика — это имеет смысл. Но что такое c =>? Откуда это пришло?
Это стрелочная функция ES6.
Конечно, но c - c ранее не объявлялся как переменная? Или должно быть counter?
Это стандартная функция обратного вызова. Вы можете написать это как function() { return newWords[counter++] || ''; }.
Я думаю, как и вы, string.replace всегда лучше, чем использование string.split и бла-бла-бла
И вам на самом деле не нужно c.
() => newWords[counter++] || '*'... ?
() => newWords[counter++] || '' - вернуть слово, найденное на счетчике, увеличить счет. Если newWords[counter] is undefined, верните пустую строку (`'*' - ваша опечатка).
Вам нужно перебрать каждый из символов в предложении и заменить слово с помощью shift:
function replaceAsterisk(sentence, newWords) {
let newStr = "";
[...sentence].forEach(char => {
if (char != "*") {
newStr += char;
} else {
newStr += newWords.shift();
}
});
return newStr;
}
console.info(replaceAsterisk("My name is * and I am a *.", ["Sabrina", "Black Cat", "extra", "words"]));Это работает. Разделение на пустые строки может быть странным (см. МДН... сплит)
let newArray = [], sentence = "My name is * and I am a *.";
for (let char of sentence){ newArray.push(char); }
for(let i = 0; i < newArray.length; i++){
if (newArray[i] == "*"){ newArray[i] = "cat"; }
}
console.info(newArray);вы можете использовать групповое совпадение регулярных выражений и Array.prototype.shift
replaceAsterisk = (text, words) => {
const _words = words.slice();
return text.replace(/(\*)/g, (match) => _words.shift() || match);
}
// valid input
const output1 = replaceAsterisk("My name is * and I am a *.", ["Sabrina", "Black Cat", "extra", "words"]);
console.info(output1);
// empty input
const output2 = replaceAsterisk("My name is * and I am a *.", []);
console.info(output2);Самый простой ответ - мне нравится этот. Таким образом, эта стрелочная функция в основном заменяет цикл for.
Вы должны сделать это таким образом? Вам не разрешено использовать встроенные функции замены?