#javascript #for-loop #if-statement #indexing #embedding
Вопрос:
Я создаю функцию для эксперимента по самостоятельному чтению с дизайном движущегося окна, в котором вводится предложение, а функция заменяет все буквы тире. Затем участник щелкает по предложениям, открывая первое слово/регион; при следующем щелчке открывается второе слово/регион, а предыдущее слово/регион снова покрывается тире и так далее до конца предложения. Ниже приведен мой код для функции replaceWithdash для достижения этой цели.
function replaceWithdash(sentenceList, currentWordNumber) {
var index, result, word, lett, reslett;
result = "";
index = 0;
while ((index < sentenceList.length)) {
word = sentenceList[index];
if ((index !== currentWordNumber)) {
result = ((result ("-".repeat(word.length))) " ");
} else {
result = ((result word) " ");
}
index = (index 1);
lett = Sentence.charAt(index);
reslett = result.charAct(index);
if (lett === " ") {
result = (reslett.replace("-"," "));
} else {
result = (reslett);
}
}
return resu<
}
Проблема, с которой я сталкиваюсь, связана с отображением пунктирного предложения. Первая функция ifelse в основном говорит, что если вы не находитесь в текущем слове, замените длину слов (разделенных в «Списке предложений», а затем определенных в «слове») тире. Если вы находитесь в текущем слове, просто отобразите это слово как есть. Таким образом, дословное отображение будет выглядеть следующим образом: Ввод = Собака съела пищу
--- --- --- ----
*click*
The --- --- ----
*click*
--- dog --- ----
и так далее. Проблема, с которой я сталкиваюсь (отсюда необходимость переменных «lett» и «reslett»), заключается в том, что я не хочу отображать слово за словом, вместо этого я хочу отображать регион за регионом. Эти области могут включать в себя несколько слов. Таким образом, в приведенном выше примере первой областью будет «собака», а не просто «тот». Чтобы правильно разделить строку для отображения при нажатии, я просто изменил ввод на «Собака, ела, еда» и сделал запятые разделителем для отдельного списка предложений. Однако это приводит к такому результату:
------- --- --------
*click*
The dog --- --------
Как вы можете видеть, дисплей корректен в том смысле, что отображается первая область, более высокая, чем первое слово, но функция replaceWithdash считывает пробелы между словами как символ, поэтому отображение тире неверно и пробел не виден (поэтому похоже, что в предложении 3 слова, а не 5). Чтобы избежать этого, я пытаюсь создать еще один оператор if, используя переменные «lett» и «reslett», которые выбирают определенный индекс в исходном предложении и в пунктирном предложении («результат»). If-else означает: если индекс символов в предложении является пробелом, то тот же индекс символов в результирующем пунктирном предложении (поскольку они одинаковой длины) заменяется пробелом. Если символ не является пробелом, то просто оставьте его как есть в результате, т. е. тире. Итак, в приведенном выше предложении через Чарат(0)-Чарат(3) тире должны остаться, но как только вы нажмете Чарат(4), «результат» теперь должен заменить этот тире пробелом.
Я мало что знаю о Java-скриптах, кроме того, чему я сам учился, поэтому я думаю, что мой код может быть немного неправильным, потому что он на самом деле не работает.
Дисплей, который мне нужен, это:
--- --- --- --- ----
*click*
The dog --- --- ----
С помощью этого кода он просто заменяет все тире пробелами (так что на дисплее ничего нет), так что здесь что-то не так, есть идеи?
Комментарии:
1. Пожалуйста, предоставьте «необработанную» строку для тестирования в качестве данных. «Две неопределенные переменные 11 lett 13 lett 12 reslett 14 reslett 16 reslett Две неиспользуемые переменные 1 _pj 2 Замените черточкой »
2. Извините, я не совсем уверен, что вы подразумеваете под «необработанной» строкой (я новичок в этом, извините). Я думал,что это будет просто предложение,подобное тому, которое я дал «The_dog, _ate, _the_food»?
3. Возможно, приведите этот пример и то, как вы передаете его функции В коде, что может помочь внести ясность в вопрос. Что вы подразумеваете под «Мой эксперимент не инициализируется» — есть ли ошибка? если да, то что это такое. Постарайтесь изолироваться от одной проблемы, которая у вас есть.
4. Таким образом, входные данные поступают из csv — файла или, более конкретно, из столбца предложений, аналогичного тому, который приведен в моем комментарии выше. Я должен был уточнить, но этот код взят из компонента кода в построителе экспериментов Psychopy3, запущенного онлайн на Павловии. Когда я говорю, что эксперимент не инициализируется, я имею в виду, что эксперимент не загружается на Павловию. Обычно это происходит из-за какой-то проблемы в Java-скрипте, который читает Павловия (поскольку также не сообщается об ошибке), и единственное, что я изменил в эксперименте, который инициализирует, — это цикл for, о котором я упоминал, поэтому я думаю, что в этом проблема.
Ответ №1:
Если я правильно понял, это то, что вы ищете или, верно?
function replaceWithdash(sentenceList, currentWordNumber) {
const regions = sentenceList.split(",")
const sigil = regions.map(s => s.replaceAll(/[^s]/g, "-"))
if (currentWordNumber !== undefined) {
sigil.splice(currentWordNumber, 1, regions[currentWordNumber])
}
return sigil.join("")
}
str = "The dog, ate, the food"
console.log(replaceWithdash(str))
//"--- --- --- --- ----"
console.log(replaceWithdash(str, 0))
//"The dog --- --- ----"
console.log(replaceWithdash(str, 1))
//"--- --- ate --- ----"
console.log(replaceWithdash(str, 2))
// "--- --- --- the food"
Комментарии:
1. Этот код корректно отображает регион за регионом, но пробелы по-прежнему считаются символами, поэтому тире по-прежнему заменяют их. Теперь дисплей для «Собака, поела, еда» является ——————— без перерывов между чем бы то ни было. Чтобы изначально были пробелы между регионами, я добавил » » «» в этот код: результат = ((результат («-«.повторите(слово. длина))) » «);. Но это не решило проблему пробелов между словами
2. Если я изменю return sigil.join(«») на return sigil.join(» «) с пробелом, это как бы помещает пробел между регионами, но опять же между регионами, определенными в списке предложений, а не между словами.
3. Есть ли способ манипулировать функцией replaceAll, чтобы игнорировать пробелы или определенные символы в регионах?
4. Это не все тире, пробелы сохраняются как пробелы, когда они скрыты. Если вы там выполните код здесь, в самом ответе (кнопка
Run code snippet
), вы увидите вывод для"The dog, ate, the food"
полностью скрытого is--- --- --- --- ----
5. Вы правы, это отлично работает, когда я просто нажимаю на это, но когда я пытаюсь это реализовать, я сталкиваюсь с некоторыми проблемами. Во-первых, список предложений определен в подпрограмме Begin (здесь не показан) как Список предложений = Предложение.разделить («,»);. «Предложение» — это имя моего столбца со всеми строками предложений. Я попытался просто избавиться от этого, так как теперь эти предложения разделены в коде, который вы даете, но теперь он по какой-то причине не работает. Я опубликую код, который я использую, в другом комментарии. Я не уверен, что это не работает, потому что сейчас это другая часть эксперимента, или в коде есть проблема