Заменить экземпляры символа « * » элементами в массиве - JavaScript

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

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

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"]));

Даже сейчас это не пихание "кошки" в массив - почему?

Вы должны сделать это таким образом? Вам не разрешено использовать встроенные функции замены?

theblackips 23.04.2019 00:53

Кроме того, какой результат вы получили от этого кода?

theblackips 23.04.2019 00:54
character instanceof Array.
StackSlave 23.04.2019 00:54

Обратите внимание, что переменная character будет array после split(), и тогда character !== "*" всегда будет истинным. Редко вы не видите это в своей консоли ...

Shidersz 23.04.2019 00:55

Я не могу использовать return sentence.replace(/"*"/g, "cat"), потому что хочу заменить звездочки на «Сабрина», «Черная кошка», «дополнительно» и «слова».

HappyHands31 23.04.2019 00:55

У вас там цитаты. Удалить их. /\*/g

StackSlave 23.04.2019 00:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
6
134
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Сначала вы должны перебрать все символы, см. пример ниже.

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(" ");. Это не обязательно, строку можно просто соединить.

theblackips 23.04.2019 00:57

Вам нужно перебрать все символы в предложении:

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 =>? Откуда это пришло?

HappyHands31 23.04.2019 01:00

Это стрелочная функция ES6.

Ori Drori 23.04.2019 01:01

Конечно, но c - c ранее не объявлялся как переменная? Или должно быть counter?

HappyHands31 23.04.2019 01:02

Это стандартная функция обратного вызова. Вы можете написать это как function() { return newWords[counter++] || ''; }.

Ori Drori 23.04.2019 01:02

Я думаю, как и вы, string.replace всегда лучше, чем использование string.split и бла-бла-бла

Mister Jojo 23.04.2019 01:03

И вам на самом деле не нужно c.

Ori Drori 23.04.2019 01:03
() => newWords[counter++] || '*'... ?
Mister Jojo 23.04.2019 01:14
() => newWords[counter++] || '' - вернуть слово, найденное на счетчике, увеличить счет. Если newWords[counter] is undefined, верните пустую строку (`'*' - ваша опечатка).
Ori Drori 23.04.2019 01:16

Вам нужно перебрать каждый из символов в предложении и заменить слово с помощью 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.

HappyHands31 23.04.2019 01:07

Другие вопросы по теме