【问题标题】:One index is dependent on another index in Java Script一个索引依赖于 Javascript 中的另一个索引
【发布时间】:2021-08-13 06:57:09
【问题描述】:

我正在为移动窗口设计自定进度阅读实验制作一个函数,其中输入一个句子,一个函数用破折号替换所有字母。然后参与者点击句子,发现第一个单词/区域;在下一次单击时,第二个单词/区域被揭开,前一个单词/区域再次被破折号覆盖,依此类推,直到句子结束。下面是我的 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 result;
}

我遇到的问题是虚线句子的显示。第一个 ifelse 函数基本上说,如果您不在当前单词上,则用破折号替换单词的长度(在 'sentenceList' 中分隔,然后在 'word' 中定义)。如果您在当前单词上,则按原样显示该单词。所以一个字一个字的显示应该是这样的: Input = The dog ate the food

--- --- --- ----
*click*
The --- --- ----
*click*
--- dog --- ----

等等。我面临的问题(因此需要 'lett' 和 'reslett' 变量)是我不想逐字显示,而是想逐个区域显示。这些区域可以包含多个单词。所以在上面的例子中,第一个 region 将是 'the dog' 而不仅仅是 'the'。为了分隔字符串以在点击时正确显示,我只是将输入更改为“狗,吃,食物”,并用逗号分隔句子列表。但是,这会产生以下结果:

------- --- --------
*click*
The dog --- --------

如您所见,显示是正确的,因为显示了第一个区域评分器而不是第一个单词,但是 replaceWithdash 函数将单词之间的空格作为字符读取,因此破折号显示不正确并且看不到空格(所以看起来句子中有3个单词而不是5个)。作为避免这种情况的一种方法,我正在尝试使用变量“lett”和“reslett”创建另一个 if 语句,这些变量在原始句子和虚线句子(“结果”)中挑选出一个特定的索引。 if-else 的意思是:如果句子中的字符索引是空格,那么结果虚线句子中的相同字符索引(因为它们的长度相同)被替换为空格。如果字符不是空格,则保持原样,即破折号。因此,在上面的句子中,通过 charAt(0)-charAt(3),破折号应该保留,但是一旦你点击 charAt(4),'result' 现在应该用空格替换那个破折号。 除了我一直在教自己的东西之外,我对 Java Script 的了解不多,所以我认为我的代码可能有点离题,因为它实际上并没有工作。 我需要的显示是这样的:

--- --- --- --- ----
*click*
The dog --- --- ----

使用此代码,它只是用空格替换所有破折号(所以显示什么都没有),所以这里出了点问题,有什么想法吗?

【问题讨论】:

  • 请提供一个“原始”字符串作为数据进行测试。 "两个未定义的变量 11 lett 13 lett 12 reslett 14 reslett 16 reslett 两个未使用的变量 1 _pj 2 replaceWithdash "
  • 对不起,我不太清楚你所说的“原始”字符串是什么意思(我是新手,抱歉)。我以为这只是我给“The_dog,_ate,_the_food”的那句话?
  • 也许把这个例子和你如何将它传递给代码中的函数可能有助于增加问题的清晰度。 “我的实验没有初始化”是什么意思 - 有错误吗?如果是这样,那是什么。尝试找出你遇到的一个问题。
  • 因此,输入来自 csv,或者更具体地说,是一列类似于我上面评论中的句子。我应该澄清一下,但这段代码来自在 Pavlovia 上在线运行的实验构建器 Psychopy3 上的代码组件。当我说实验没有初始化时,我的意思是实验没有加载到 Pavlovia。这通常是由于 Pavlovia 正在阅读的 Java 脚本中的一些问题(因为也没有报告错误),而我从一个初始化的实验中唯一改变的是我提到的 for 循环,所以我认为这就是问题所在.

标签: javascript for-loop if-statement indexing embedding


【解决方案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"

【讨论】:

  • 此代码确实可以按区域正确显示,但空格仍被视为字符,因此破折号仍会替换它们。现在显示“The dog, ate, the food” 是 -------------------------------- 任何东西之间没有中断。为了最初在区域之间有空格,我在这段代码中添加了“+”“”:result = ((result + (“-”.repeat(word.length))) +“”);。但它并没有解决单词之间的空格问题
  • 如果我将 return sigil.join("") 更改为 return sigil.join(" ") 带有一个空格,它有点在区域之间放置一个空格,但同样是在 sentenceList 中定义的区域之间,而不是单词之间。
  • 有没有办法操纵 replaceAll 函数以忽略区域内的空格或特定字符?
  • 不全是破折号,空格在隐藏时保持为空格。如果您在答案本身中执行代码(按钮Run code snippet),您将看到"The dog, ate, the food" 完全隐藏的输出为--- --- --- --- ----
  • 你说得对,当我按下它时效果很好,但是当我尝试执行它时,我遇到了一些问题。首先是在 Begin Routine(此处未显示)中将 sentenceList 定义为 sentenceList = Sentence.split(",");。 'Sentence' 是我所有句子字符串的列名。我试着摆脱它,因为现在这些句子在你提供的代码中被分开了,但现在由于某种原因它没有运行。我将在另一条评论中发布我正在使用的代码。我不确定它是否不起作用,因为它现在处于实验的不同部分,或者代码中是否存在问题
猜你喜欢
  • 2015-08-07
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
相关资源
最近更新 更多