RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1417787
Accepted
Valentin
Valentin
Asked:2022-08-07 16:57:01 +0000 UTC2022-08-07 16:57:01 +0000 UTC 2022-08-07 16:57:01 +0000 UTC

JS:在 forEach 循环中使用 findIndex 的正确方法是什么?

  • 772

我刚刚开始学习 JS,所以我提前为这个问题道歉,这对于更有经验的人来说可能看起来很愚蠢。有一个训练代码:

<html>
<script>
let inputWord = 'mappet'

let lettersArr = inputWord.split('');
                
lettersArr.forEach(function(letter) {
    console.log(letter);
    let index = lettersArr.findIndex(i => i == letter);
    
    if(lettersArr[index] == 'p' && lettersArr[index + 1] == 'p') {
        
        lettersArr[index] = lettersArr[index] + '—';
       
    }
    
});

let withTransfer = lettersArr.join("");

alert(withTransfer);
</script>
</html>

如果 inputWord 变量包含单词“mappet”,那么它可以安全地工作,在两个“p”之间插入一个破折号,但如果它包含“pappet”或任何其他单词,其首字母重复了中间的两倍,那么条件不起作用。我认为这是因为 findIndex 它需要第一次出现字母并检查条件。在“pappet”的情况下,第一个条件将是启动所有内容的非双 p,因此它不会满足中间“pp”的条件。

请告诉我如何确保单词 pappet 中的第一个 p 不会干扰在中间插入破折号。我绞尽脑汁却什么也想不出来。

javascript массивы
  • 2 2 个回答
  • 57 Views

2 个回答

  • Voted
  1. EzioMercer
    2022-08-07T17:46:25Z2022-08-07T17:46:25Z

    如果我理解正确,那么无论如何都需要pp替换为p-p. 有几种解决问题的方法(当然,这里不是所有可能方法的完整列表,但本质 + - 将是相同的):

    • 如果您只需要替换遇到的第一个(通过正则表达式):

      const pasteDefisBetweenTwoP = (str) => str.replace('pp', 'p-p');
      
      console.log(pasteDefisBetweenTwoP('mappet'));
      console.log(pasteDefisBetweenTwoP('pappet'));
      console.log(pasteDefisBetweenTwoP('mappetmappet'));

    • 如果您只需要更换遇到的第一个(通过循环):

      const pasteDefisBetweenTwoP = (str) => {
        const strAsArr = str.split('');
        let savePPindex = null;
        
        for(let i = 0; i < strAsArr.length; ++i) {
          if (strAsArr[i] === 'p' && strAsArr[i + 1] === 'p') {
            savePPindex = i;
            break;
          }
        }
        
        if (savePPindex !== null) strAsArr.splice(savePPindex + 1, 0, '-');
        
        return strAsArr.join('');
      };
      
      console.log(pasteDefisBetweenTwoP('mappet'));
      console.log(pasteDefisBetweenTwoP('pappet'));
      console.log(pasteDefisBetweenTwoP('mappetmappet'));

    • 如果您需要替换所有内容(通过正则表达式)(1):

      const pasteDefisBetweenTwoP = (str) => str.replace(/pp/g, 'p-p');
      
      console.log(pasteDefisBetweenTwoP('mappet'));
      console.log(pasteDefisBetweenTwoP('pappet'));
      console.log(pasteDefisBetweenTwoP('mappetmappet'));

    • 如果您需要替换所有内容(通过正则表达式)(2):

      const pasteDefisBetweenTwoP = (str) => str.replaceAll('pp', 'p-p');
      
      console.log(pasteDefisBetweenTwoP('mappet'));
      console.log(pasteDefisBetweenTwoP('pappet'));
      console.log(pasteDefisBetweenTwoP('mappetmappet'));

    • 如果您需要更换所有东西(通过循环)(1):

      const pasteDefisBetweenTwoP = (str) => {
        const strAsArr = str.split('');
        const savePPindexes = [];
        
        for(let i = 0; i < strAsArr.length; ++i) {
          if (strAsArr[i] === 'p' && strAsArr[i + 1] === 'p') {
            savePPindexes.push(i);
          }
        }
        
        for (let i = savePPindexes.length - 1; i >= 0; --i) {
          strAsArr.splice(savePPindexes[i] + 1, 0, '-');
        }
        
        return strAsArr.join('');
      };
      
      console.log(pasteDefisBetweenTwoP('mappet'));
      console.log(pasteDefisBetweenTwoP('pappet'));
      console.log(pasteDefisBetweenTwoP('mappetmappet'));

    在此示例中,您需要从数组的末尾开始。因为我们在还没有插入任何内容的时候保存了数组索引。如果你从头开始插入,它只会在第一次插入时正常工作,但在那之后,其他字母的索引会立即改变(我们将它们保持在以前的状态),结果我们将插入一个在错误的地方冲刺。因此,我们从最后开始,这样在插入破折号时,我们可以安全地引用旧索引,因为在插入之后,索引只会改变后续字母,而不是之前的字母

    • 如果您需要更换所有东西(通过循环)(2):

      const pasteDefisBetweenTwoP = (str) => {
        const strAsArr = str.split('');
        const savePPindexes = [];
        
        for(let i = 0; i < strAsArr.length; ++i) {
          if (strAsArr[i] === 'p' && strAsArr[i + 1] === 'p') {
            strAsArr[i] += '-';
          }
        }
        
        return strAsArr.join('');
      };
      
      console.log(pasteDefisBetweenTwoP('mappet'));
      console.log(pasteDefisBetweenTwoP('pappet'));
      console.log(pasteDefisBetweenTwoP('mappetmappet'));

    • 2
  2. Best Answer
    Rudi
    2022-08-07T17:36:25Z2022-08-07T17:36:25Z

    没错,findIndex 方法为数组中存在的每个元素调用一次传递的回调函数,直到它返回 true。如果找到这样的元素,findIndex 方法将立即返回该元素的索引。

    forEach 回调方法接受三个参数“元素、索引、数组”

    您可以立即检查下一个字符是否匹配。

    <html>
    <script>
    let inputWord = 'pappet'
    
    let lettersArr = inputWord.split('');
                    
    lettersArr.forEach(function(letter,i) {
        if(lettersArr[i] == 'p' && lettersArr[i] == lettersArr[i+1]) lettersArr[i] += "-"
    });
    
    let withTransfer = lettersArr.join("");
    
    console.log(withTransfer);
    </script>
    </html>

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5