学习Javscript。
Kata描述如下......
给定一个数字,在每个奇数整数之前和之后返回带有短划线' - '标记的字符串,但不要用短划线标记开始或结束字符串。
Link = https://www.codewars.com/kata/dashatize-it/train/javascript
当前代码:
function dashatize(num) {
var numP = Math.abs(num) + '';
var result = [numP[0]];
while (numP > 0) {
for (var x = 1; x < numP.length; x++) {
result.push('-', numP[x]);
}
return result.join('');
}
return numP;
}
测试案例:
Test.describe("Basic", function(){
Test.assertEquals(dashatize(274), "2-7-4", "Should return 2-7-4");
Test.assertEquals(dashatize(5311), "5-3-1-1", "Should return 5-3-1-1");
Test.assertEquals(dashatize(86320), "86-3-20", "Should return 86-3-20");
Test.assertEquals(dashatize(974302), "9-7-4-3-02", "Should return 9-7-4-3-02");
});
Test.describe("Weird", function(){
Test.assertEquals(dashatize(NaN), "NaN", "Should return NaN");
Test.assertEquals(dashatize(0), "0", "Should return 0");
Test.assertEquals(dashatize(-1), "1", "Should return 1");
Test.assertEquals(dashatize(-28369), "28-3-6-9", "Should return 28-3-6-9");
});
问题是:如何重构此代码以不将连字符与非奇数整数放在一起。感谢
答案 0 :(得分:2)
这是一个可能的解决方案:
function dashatize(num) {
return num.toString().
replace(/([13579])/g,'-$1-'). // dashes around odd digits
replace(/\-+/g,'-'). // replace multiple dashes by one dash
replace(/^\-/,''). // remove starting dash
replace(/\-$/,''); // remove ending dash
}
它可能更短,但至少它很容易理解。
答案 1 :(得分:0)
不太可读的解决方案:
function dashatize(num) {
//get 'em
num = Math.abs(num) + ''
num = num.split('').map( (char, i, chars) => {
if( Number(char) != char) return char;
return Number(char) % 2 !== 0 ?
( Number(chars[i-1]) % 2 === 0 ? '-' + char + '-' : char + '-') : char;
})
num = num.join('')
num = num[num.length-1] === '-' ? num.slice(0,num.length-1) : num;
return num;
};
您可以使用regex
和replace