Javascript String.slice()方法返回的奇怪结果

Javascript String.slice()方法返回的奇怪结果,javascript,string,slice,Javascript,String,Slice,我的例子是将一个字符串分离为字符串数组,然后将每三个字符转换为一个字符串。(例如,“xxxyyy”->['xxx','yyy']) const translate=函数(RNA){ var arrRna=Array.from(RNA); var-arr=[]; for(arrRna中的var键){ 如果((键%3)=0){ var temp=RNA切片(键,(键+3)); arr.push(温度); } } 返回arr; } console.log(翻译('xxxyyzzz'))问题在于,fo

我的例子是将一个字符串分离为字符串数组,然后将每三个字符转换为一个字符串。(例如,“xxxyyy”->
['xxx','yyy']

const translate=函数(RNA){
var arrRna=Array.from(RNA);
var-arr=[];
for(arrRna中的var键){
如果((键%3)=0){
var temp=RNA切片(键,(键+3));
arr.push(温度);
}
}
返回arr;
}

console.log(翻译('xxxyyzzz'))
问题在于,
for..in
在属性名称上循环,并且属性名称始终是字符串。例如,当
为3时:

var temp = RNA.slice( key,  (key+3));
评估为

var temp = RNA.slice('3',  '33');
因为当涉及字符串时,
+
会连接。您可以先将其转换为编号:

const translate=函数(RNA){
var arrRna=Array.from(RNA);
var-arr=[];
for(arrRna中的var键){
键=数字(键);
如果((键%3)=0){
var temp=RNA切片(键,(键+3));
arr.push(温度);
}
}
返回arr;
}

console.log(翻译('xxxyyzzz'))塔达!与其将字符串转换为数组并遍历每个字符,等待索引为3的倍数,不如简单地按3计数

函数翻译(rna){
设arr=[];
for(设i=0;iconsole.log(translate('xxxydyzd'))嘿,所以我解决了问题。当您将3添加到键时,它会将结果关联为0、03、3、33、6、63作为键,将键+3作为您看到的结果

const translate=函数(RNA){
var arrRna=Array.from(RNA);
var-arr=[];
for(arrRna中的var键){
如果((键%3)=0){
console.log(键)
console.log(键+3)
var temp=RNA切片(键,(键+3));
arr.push(温度);
}
}
返回arr;
}

console.log(翻译('xxxyyzzz'))除了向字符串添加数字(对象的键是什么)之外,您可以使用生成器对字符串进行任意切片

函数*translate(字符串、大小){
var i=0;
而(iconsole.log([…translate('xxxyyzzz',3)]使用带有映射回调的
Array.from()
方法来完成整个过程

const translate=(RNA)=>{
返回Array.from({length:Math.ceil(RNA.length/3)},(u,i)=>RNA.slice(i*3,i*3+3));
}

console.log(翻译('xxxyyzzz'))独立于字符数(3)共享另一个解决方案


你不应该在数组上的
循环中使用
,这通常是不可靠的,因为(不幸的是)向内置类型添加可枚举方法的常见做法(以及键是字符串而不是下面答案中指出的数字这一事实)。你就像上帝一样,regex解决方案很有趣
let spltStr = myStr =>
  [...myStr.toLowerCase()].reduce((acc, char) => {
    let last = acc[acc.length - 1];
    !last || last[last.length - 1] !== char
      ? acc.push(char)
      : (acc[acc.length - 1] += char);
    return acc;
  }, []);