【问题标题】:Javascript: Checking if string contains a character, then removing part of a string?Javascript:检查字符串是否包含字符,然后删除字符串的一部分?
【发布时间】:2016-05-08 03:17:48
【问题描述】:

本质上,这个函数应该做的是从输入文本中获取单词列表,并从下拉菜单中以客户选择的间隔 (WPM) 将其设置在显示器上。

如果函数中传递的单词包含问号、句点、冒号、分号、感叹号或逗号,则将其删除,并将所选间隔加倍。例如,如果单词之间的延迟是 117 毫秒,那么它将是 234 毫秒。

我很难确定您确定传递的单词是否包含标点符号并将其删除的部分。

我收到一个错误: 未捕获的类型错误:无法读取未定义的属性“indexOf”。

我不确定为什么会这样,因为 list[index++]StringindexOf 是 Javascript 中的字符串方法,而不是属性。

我也不确定如何实施延迟。鉴于我以这种方式使用了setInterval()(并且我只能为此目的使用 setInterval),我不确定如何在显示中设置String 两次,同时还包括延迟.

function runDisplay(data, id) {
        var reader = document.getElementById(id);
        var index = 0;
        if (timer) {
            clearInterval(timer);
        }
        if (data.length) {
            timer = setInterval(function() {


            var punctuation = [".", ",", ":", ";", "!", "?"];
            var textSpeed = 117; // default
            for (var j = 0; j < punctuation.length; j++) {
                // remove punctuation if found and double text delay
                // if multiple found, remove only one
                if (!(data[index++].indexOf(punctuation[j]) === -1)) {
                    data[index++] = string.replace(punctuation[j], '');
                // set data[index++] to display twice to double delay?
                }
            } 



            reader.innerHTML = data[index++];
            index = index % data.length;
          }, textSpeed);
        }
    }

【问题讨论】:

    标签: javascript string character contains intervals


    【解决方案1】:

    代码很乱,但我希望这就是你想要的……有点:

    var str = "some text with no punctuation. And some;: text. with, punctuation? symbols!!? to print"
    
    var print = function(str) {
        var re = /([^ .,:;!?]+)|([.,:;!?]+)/gi
        var reSkip = /[.,:;!?]+/gi           //remove + to add delay for each punctuation symbol instead of the group of symbols
        var substrs = str.match(re)
    
        var delay = 117
        var timeToPrint = new Date().getTime() + delay
        var i = 0
    
        console.log(substrs.length)
        var printWord = function() {
            console.log(substrs[i])
            if ( new Date().getTime() < timeToPrint ) {
                console.log(new Date().getTime() +'<'+timeToPrint)
                requestAnimationFrame(printWord)
                return
            }
            if ( reSkip.test(substrs[i]) ) {
                i++
                timeToPrint += delay*5              //to make delay more obvious
                console.log('skip punctuation')
                requestAnimationFrame(printWord)
                return
            }
            document.write(substrs[i++] + ' ')     //replace this with your code to print where you want
            timeToPrint += delay
            console.log('written')
            if (i < substrs.length)
                requestAnimationFrame(printWord)
        }
        printWord()
    }
    print(str)
    

    只需将其粘贴到 chrome 控制台进行测试。

    【讨论】:

      【解决方案2】:

      我收到一个错误:未捕获的类型错误:无法读取属性 'indexOf' 未定义。

      我不确定为什么会这样,因为 list[index++] 是一个字符串并且 indexOf 是 Javascript 中的字符串方法,而不是属性。

      首先,方法也是对象的属性。

      其次,JS 引擎告诉你,你在 undefined 上调用 indexOf,所以它不是字符串。而data[index++] 是未定义的,因为index 可能不是dataarray 范围内的索引。

      该函数的主要问题是,如果data 是一个单词数组,则无法正确迭代它。在这里,您在每次读取数组时递增 indexindex 应该每次显示只递增一次。

      我也不确定如何实施延迟。鉴于我已经 以这种方式使用 setInterval() (我只能将 setInterval 用于 目的)我不确定如何设置字符串 显示两次,同时还包括延迟。

      如果函数必须在无限循环中显示所有单词(这就是index = index % data.length 的目的,对吗?),可以在传递给当前 setInterval 的匿名函数内调用 clearInterval 和另一个 setInterval,从而计算你想要的文本速度。

      【讨论】:

      • 谢谢,这帮助我弄清楚如何解决我的程序问题。
      【解决方案3】:

      index++ 每次调用都会增加索引变量,并且您在循环体中调用它两次。 在if (!(data[index++].indexOf(punctuation[j]) === -1)) {index 中可以说是 i,在data[index++] = string.replace(punctuation[j], ''); 中是 i+1。

      【讨论】:

        猜你喜欢
        • 2019-08-05
        • 2016-10-15
        • 1970-01-01
        • 2011-11-09
        • 2013-05-18
        • 2017-08-15
        • 2022-06-14
        • 1970-01-01
        • 2013-10-26
        相关资源
        最近更新 更多