Один индекс зависит от другого индекса в Java-скрипте

#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 (здесь не показан) как Список предложений = Предложение.разделить («,»);. «Предложение» — это имя моего столбца со всеми строками предложений. Я попытался просто избавиться от этого, так как теперь эти предложения разделены в коде, который вы даете, но теперь он по какой-то причине не работает. Я опубликую код, который я использую, в другом комментарии. Я не уверен, что это не работает, потому что сейчас это другая часть эксперимента, или в коде есть проблема