【问题标题】:Insert multiple elements into array with splice method使用拼接方法将多个元素插入数组
【发布时间】:2021-08-06 08:45:23
【问题描述】:

我有一个问题正在尝试解决。我试图在有大写字母实例的地方插入一个空格。问题是该空间被推入正确的索引,但对于所有其他出现大写字母的情况,它不会应用该空间。我对拼接方法进行了广泛的研究,但无法找到解决问题的方法。有人能指出我正确的方向吗?

function solution(string) {
  
  let splitStr = [...string];
  
  
  for(let i = 0; i < splitStr.length; i++) {
    
    if(!splitStr[i].toUpperCase()) return
    
    if(splitStr[i] === splitStr[i].toUpperCase()) {
        let indexOfCapLetter = splitStr.indexOf(splitStr[i].toUpperCase());
        splitStr.splice(indexOfCapLetter, 0, ' ' );
        
        return splitStr
      }
    
  }
  
 
}

【问题讨论】:

  • 因为splitStr[i] === splitStr[i].toUpperCase()你插入一个空格然后返回。
  • 你的逻辑也坏了。插入空格会增加后续字母的索引,因此如果您在 4 处插入空格,则该字母将移至 5,因此在下一次迭代中您再次测试相同的字母,插入另一个空格,等等。ad infinitum i> (或者直到你得到一个堆栈溢出)。因此,当您插入空格时,请额外增加 i (或从 splitStr.length 循环到零或从右到左,而不是从零循环到 splitStr.length 或从左到右)。

标签: javascript splice


【解决方案1】:

第一个问题是您在循环中的 if 语句中返回数组。这在第一个大写字母之后转义了函数。但在那之后还有另一个问题。

每当您向数组中添加一个新元素时,它后面的字符都会移动到更高的索引。

为了解决这个问题,您可以向后循环遍历数组,以便受影响的元素始终是您已经解析过的元素:

function solution(string) {
  
  let splitStr = [...string];
  
  
  for(let i = splitStr.length-1; i >=0; i--) {
    
    if(splitStr[i] === splitStr[i].toUpperCase()) {
        splitStr.splice(i, 0, ' ' );
      }
  }
  
  return splitStr.join('');
}

console.log(solution('HelloWorldLongString'))

【讨论】:

  • 感谢您的解释,我明白您所说的一切!但我不想讨论关于递减的部分。这不会导致同样的问题,因为我们仍在移动索引。
  • @Alanaj 当我们在i 添加或删除一个元素时,我们只影响i 之后的索引,并且因为我们在数组中向后移动,未来的迭代只关心@ 之前的索引987654324@,所以不会造成任何问题。
  • 哦,好的。感谢您的解释。消化需要一分钟。祝您度过愉快的一周!
猜你喜欢
  • 2021-07-28
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
  • 2012-07-21
  • 2017-12-13
  • 2020-02-21
  • 2015-02-22
相关资源
最近更新 更多