我想编写一个函数来压缩字符串,例如“ bbbab”,将其转换为“ b3ab”,而我陷入困境
仅打印“ b3”
这是到目前为止的代码
let string = 'bbbab';
let letters = string.split("");
let currentAlphabetLetter = letters[0];
let count = 0;
let newString = [];
string.split("").forEach(letter => {
if (letter === currentAlphabetLetter) {
count++;
} else {
if (count > 0) {
newString.push(`${currentAlphabetLetter}${count}`);
} else {
newString.push(`${letter}`);
}
count = 0;
currentAlphabetLetter = letter;
}
})
console.log(newString);
答案 0 :(得分:1)
当您开始一个新字母时,需要将count
设置为1
,否则就不会计算该字符的首次出现。
这在字符串的开头就没有问题,因为您处理了第一个字母两次:用let currentAlphabetLetter = letters[0];
提取它,然后在forEach
的第一次迭代中再次处理它。为了使字符串的开头与其他出现的字符串相同,您应该迭代从第二个字符开始的子字符串。
您不应将其附加到数组上,而应附加到字符串上。
当count
为1
时,您需要附加currentAlphabetLetter
而不是letter
。
let string = 'bbbab';
let letters = string.split("");
let currentAlphabetLetter = letters[0];
let count = 1;
let newString = "";
string.substr(1).split("").forEach(letter => {
if (letter === currentAlphabetLetter) {
count++;
} else {
if (count > 1) {
newString += `${currentAlphabetLetter}${count}`;
} else {
newString += `${currentAlphabetLetter}`;
}
count = 1;
currentAlphabetLetter = letter;
}
});
// Process the last letter
if (count > 1) {
newString += `${currentAlphabetLetter}${count}`;
} else {
newString += `${currentAlphabetLetter}`;
}
console.log(newString);
答案 1 :(得分:1)
您可以执行以下操作;
var str = 'bbbabccc',
res = [...str].reduce((r,c,i) => (r[r.length-1][0] === c || !i) ? (r[r.length-1] += c, r)
: r.concat(c), [""])
.reduce((r,s) => r + s[0] + (s.length-1 ? s.length : ""), "");
console.log(res);
我们在这里级联了两个.reduce()
,但是首先很高兴知道[...str]
变成了["b", "b", "b", "a", "b", "c", "c", "c"]
。
第一个.reduce()
会将其简化为一个字符串数组,例如["bbb", "a", "b", "ccc"]
。
第二个.reduce()
会将其进一步简化为结果。每个减速器的内部机制都由您解决。
不过,作为提示,请记住,,
中的逗号运算符(r[r.length-1] += c, r)
采用r
数组的最后一个元素(此处为累加器),将c
添加到结束并返回r
。
答案 2 :(得分:1)
groupCharacters在每组唯一字符之间添加一个空格,并将其拆分为一个数组
compressCharacters如果长度大于1,则用数字值映射数组中的每个元素。
const str = 'bbbab';
const groupCharacters = str => [...str].reduce((accumulator, element, index) => accumulator + element + (str[index + 1] !== undefined ? element === str[index + 1] ? '' : ' ' : '')).split(" ");
const compressCharacters = arr => arr.map(e => e[0] + (e.length > 1 ? e.length : '')).join("")
compressCharacters(groupCharacters(str));
答案 3 :(得分:0)
就像这样对你有用
let string = 'bbbab';
let newString = [];
if (string.length < 2) { console.log(string); }
else {
let letters = string.split("");
let prev = letters[0];
let count = 1;
for( var i = 1; i < letters.length; i++) {
if (letters[i] !== prev) {
count > 1 ? newString.push(`${prev}${count}`) : newString.push(`${prev}`);
count = 1;
} else {
count++;
}
prev = letters[i];
}
/* last element push */
count > 1 ? newString.push(`${prev}${count}`) : newString.push(`${prev}`);
console.log(newString.join(""));
}