使用拼接Javascript以增量方式在数组中添加元素

时间:2015-07-15 00:38:56

标签: javascript arrays

我试图添加" - "在大写字母之前。例如helloWorld成为你好世界。

然而,我的代码是放置" - "在数组中的错误位置。 即thisIsSpinalTap成为this-I-sSpin-alTap

我的代码出了什么问题?

function spinalCase(str){
str = str.replace(/ /g,'-');
strArr = str.split("");
for(i=1;i<str.length;i++){
    if(str.charAt(i)==str.charAt(i).toUpperCase()&&str.charAt(i)!=="-"){
        console.log(i);
        strArr.splice(i,0,"-");
    }
} 
return strArr.join("");
}

spinalCase('thisIsSpinalTap'); // returns this-I-sSpin-alTap 

2 个答案:

答案 0 :(得分:3)

每次进行拼接时,strArr漂移到左边是错误的。理想情况下,你应该保留另一个从0开始的计数器,并在你进行另一次拼接时增加,例如:

var k = 0;
// ...
    strArr.splice(i + k, 0, '-');
    ++k;

假设您不仅仅是这样做,这是一种更容易的方法:

var s = 'thisIsSpinalTap';

var res = s.replace(/([a-z])([A-Z])/g, '$1-$2'); // "this-Is-Spinal-Tap"

表达式匹配小写字母后跟一个大写字母,然后用中间的短划线替换它。

答案 1 :(得分:1)

这里的问题是你是在循环中修改数组,但是你正在使用字符串检查字符,而字符串没有根据数组中发生的新字符插入进行更新,所以当-是插入字符串中的索引将比数组的索引少1,这就是-插入的位置比第二个实例中所需的位置少1个位置。每次插入都会继续使用相同的模式,因此第3次插入将在postion-2

进行

&#13;
&#13;
function spinalCase(str) {
  str = str.replace(/ /g, '-');
  var strArr = str.split(""),
    i, code;
  for (i = 1; i < str.length; i++) {
    //since we are modifying the array the indexes in the original array can't be used
    code = strArr[i].charCodeAt(0);
    if (code >= 65 && code <= 90) {
      strArr.splice(i, 0, "-");
      //since we are inserting a new element before current element we need to skip an extra element
      i++;
    }
  }
  return strArr.join("");
}

var result = spinalCase('thisIsSpinalTap');
snippet.log(result)
&#13;
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;