[英]refactoring a function using reduce - javascript
我编写了一个函数,可以将“ aaazeeeee”等字符串转换为“ aaa z eeeee”的新字符串
这是我尝试过的代码
const groupCharacters = signature => { let newSignature = "", arr = []; let result = [...signature].reduce((accumulator, element, index) => { // check if last element in accumulator matches current element if (accumulator[accumulator.length -1] !== element) { // push accumulator into array arr.push(accumulator); // set newSignature as new element newSignature = element; } else { // else add element to newSignature newSignature = accumulator += element; } // if is last item, push to array if (index === signature.length - 1) arr.push(element); return newSignature; }) return arr; } console.log(groupCharacters('aabaaaaa'));
我该如何重构它以便不需要新的字符串或数组? 我已经尝试过这样的事情
const groupCharacters = str => [...str].reduce((accumulator, element) => accumulator[accumulator.length - 1] !== element ? `${accumulator} ` : accumulator + element)
它输出'aaa'
我该如何修复它或使用诸如map之类的东西?
要更改现有代码,但仍使用reduce
,我建议reduce
为字符串而不是array:在每次迭代中,与当前字符连接,如果下一个字符已定义且未定义,则还与空格连接等于当前字符:
const groupCharacters = str => ( [...str].reduce((a, char, i) => a + char + ( str[i + 1] === char || str[i + 1] === undefined ? '' : ' ' ), '') ); console.log(groupCharacters('aaazeeeee'));
或者,您可以使用一个简单的正则表达式-捕获组中的单词字符,然后尽可能多地反向引用该组,并替换为整个匹配项和一个空格:
const groupCharacters = signature => signature.replace(/(\\w)\\1*(?!\\1|$)/g, '$& '); console.log(groupCharacters('aaazeeeee'));
分解:
(\\w)
-匹配任何单词字符,将其捕获在第一组中(以便以后可以使用\\1
对其进行反向引用)
\\1*
-贪婪地重复刚刚匹配零次或多次的字符(尽可能重复)
(?!\\1|$)
-检查刚刚匹配的子字符串是否不跟在字符串的末尾或另一个相同字符的后面。 这样可以确保最终重复的子字符串也不会附加空格(也就是说,您不希望使用'aaa z eeeee '
)。
顺便说一句,正则表达式\\G(\\w)\\1*+(?!$)
将完成相同的操作,更易于阅读,并且效率更高( \\G
匹配最后一个匹配项的末尾或该字符串的开头,而+
在\\1*+
,使重复的占有欲 ,这意味着,在最后的子串,发动机将无法原路返回,而一旦最终全子被选中,这样就会立即失败,而不是首先迭代其每个字符)。 但是,不幸的是,本机JS不支持所有格量词,也不支持\\G
锚。
我将使用reduce来实现此目的,因为OP希望通过reduce
来实现:
function myFunc(str) { return str.split('').reduce(function (acc, cv, ci) { if (acc.lastElem != cv) { acc.str += (acc.lastElem == "") ? cv : ' ' + cv; } else { acc.str += cv; } acc.lastElem = cv; return acc; }, { lastElem: '', str: '' }).str; } console.log(myFunc('aaabbbcc')); console.log(myFunc('aaazeeeee'))
这个怎么运作?
累加器是一个具有键lastElem
(当前元素之前的元素)和str
(字符串形成)的对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.