我正在尝试用JavaScript解决此问题,但很难做到这一点。
假设某人说了一条诸如"yeah"
之类的消息,我需要返回"yyeeaahh"
或原始字符串中每个字符的频率不均匀:
"yyeaaahhh"
,然后我的函数应返回:
"yyyeeaaaahhhh"
我的方法如下:
我首先将字符串变成其字符的Array
。
获取数组后,我决定创建一个具有键值对的JavaScript对象,其中键是字母,值是字母在字符串中出现的次数。
然后,我了解了Object.entries()
方法,该方法使我可以将这些键值对的数组作为数组。
我遇到的麻烦是如何将该数组映射到一个新数组,该数组包含显示的键(value + 1)
次,其中value是键在原始字符串中的对应频率。
在更直观的上下文中,我想从这里转到这个:
[['y', 2], ['e', 3], ['a', 3], ['h', 2]] => ['yyy', 'eeee', 'aaaa', 'hhh']
在此之后,我认为可以将这个array
细微地加入一个string
中,以得到结果字符串。
到目前为止,这是我的代码:
function newString(string) {
const strArr = string.split('')
var counts = {};
for (var i = 0; i < strArr.length; i++) {
if ((string.match(new RegExp(strArr[i], "g"))).length >= 1) {
counts[string[i]] = (string.match(new RegExp(string[i], "g"))).length;
}
}
var countArr = Object.entries(counts)
var newStrArr = []
for(const [key,value] in countArr) {
newStrArr.push(key.repeat(value + 1))
}
return newStrArr
}
[['y', 2], ['e', 3], ['a', 3], ['h', 2]] => ['yyy', 'eeee', 'aaaa', 'hhh']
答案 0 :(得分:3)
您可以利用正则表达式的功能并查找一个不会重复的字符,然后将其替换为两个。
var string = 'yeeaaahhhh';
console.log(string.replace(/(.)(?!\1)/g, '$&$&'));
答案 1 :(得分:1)
只需创建一个字符串变量并进行连接。循环遍历创建的数组,并获取当前字母和当前字母的频率。然后创建另一个循环,以将字母添加到字符串频率+1倍。
var str = '';
for (var i = 0; i < newStrArr.length; i++) {
var letter = newStrArr[i][0];
var freq = newStrArr[i][1];
for (var j = 0; j < freq + 1; j++) {
str += letter;
}
}
答案 2 :(得分:0)
当您需要将数组从某种形状转换为另一种形状而又不确定如何进行转换时,可以使用Array.reduce
。这是一个非常强大的功能,可让您使用自定义逻辑来递归遍历数组。
const arr = [['y', 2], ['e', 3], ['a', 3], ['h', 2]]
const word = arr.reduce((newWord, currentLetter) => {
//deconstructing my variables
const [letter, count] = currentLetter
//use a loop and a template literal to alter our string
//using less than equals we can include 0 in the count
//effectively adding an extra letter
for(let i = 0; i <= count; i++) {
newWord = `${newWord}${letter}`
}
//when reducing, don't forget to return your value
return newWord
}, '')
console.log(word) // --> yyyeeeeaaaahhh
希望有帮助!