我的例子是将一个字符串分成字符串数组,然后将每三个字符转换为一个字符串。 (例如“xxxyyy”-> ['xxx','yyy']
)
const translate = function (RNA) {
var arrRna = Array.from(RNA);
var arr = [];
for (var key in arrRna) {
if ((key % 3) == 0) {
var temp = RNA.slice( key, (key+3));
arr.push(temp);
}
}
return arr;
}
console.log(translate('xxxyyyzzz'));
预期结果:['xxx','yyy','zzz']
但我想要的结果是:[ 'xxx', 'yyyzzz', 'zzz' ]
另外,我注意到 slice 方法在第一次迭代中按预期工作,但在那之后,奇怪的结果 --> 'yyyzzz'。为什么??
最佳答案
问题是 for..in
遍历属性名,而属性名总是字符串。因此,例如,当 key
为 3 时:
var temp = RNA.slice( key, (key+3));
评估为
var temp = RNA.slice('3', '33');
因为 +
在涉及字符串时连接。您可以先转换为 Number
:
const translate = function(RNA) {
var arrRna = Array.from(RNA);
var arr = [];
for (var key in arrRna) {
key = Number(key);
if ((key % 3) == 0) {
var temp = RNA.slice(key, (key + 3));
arr.push(temp);
}
}
return arr;
}
console.log(translate('xxxyyyzzz'));
或者,您可以使用普通的 for
循环对数组进行分块,其逻辑可能更容易一目了然地理解:
const translate = function(RNA) {
const output = [];
for (let i = 0; i < RNA.length; i += 3) {
output.push(RNA.slice(i, i + 3));
}
return output;
}
console.log(translate('xxxyyyzzz'));
另一种选择是使用全局正则表达式 .match
:
const translate = RNA => RNA.match(/.{1,3}/g);
console.log(translate('xxxyyyzzz'));
关于javascript - String.slice() 方法返回的奇怪结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53924902/