用短划线返回一个字符串' - '每个奇数整数之前和之后的标记

时间:2016-11-18 18:52:22

标签: javascript

学习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");
});

问题是:如何重构此代码以不将连字符与非奇数整数放在一起。感谢

2 个答案:

答案 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;
    };

您可以使用regexreplace

更优雅地实现它