是否可以简化一系列String.replace操作?

时间:2014-05-24 01:55:04

标签: javascript

有没有办法简化这个功能?在最后270个字符的代码中,只有50个字符对于它们各自的语句是唯一的。非常不优雅。没有jQuery请 - 我宁愿拥有一个vanilla Javascript解决方案。非常感谢!

function numbersToLetters(number) {
    var n = number.toString();
    var l = n.replace('1', 'One');
    l = l.replace('2', 'Two');
    l = l.replace('3', 'Three');
    l = l.replace('4', 'Four');
    l = l.replace('5', 'Five');
    l = l.replace('6', 'Six');
    l = l.replace('7', 'Seven');
    l = l.replace('8', 'Eight');
    l = l.replace('9', 'Nine');
    l = l.replace('0', 'Zero');
}

4 个答案:

答案 0 :(得分:8)

您可以创建地图:

var map = {
  "1" : "One",
  "2" : "Two",
  ...
}

function numbersToLetters(number) {
  var l = "" + number;
  for(var num in map){
    if(!map.hasOwnProperty(num)) continue;
    l = l.replace(num, map[num]);
  }
  return l;
}

答案 1 :(得分:1)

var map = ['Zero', 'One', 'Two', 'Three', 'Four',
  'Five', 'Six', 'Seven', 'Eight', 'Nine'];

function numbersToLetters(number) {
  number = number.toString();
  var string = '';
  for(var l in number) {
    string += map[number[l]] || number[l];
  }
  return string;
}

alert(numbersToLetters('1 and 2'));

这支持混合内容的字符串。

答案 2 :(得分:0)

尝试使用列表:

var replacementList = [
   "Zero" ,
   "One" ,
   "Two" ,
   "Three" ,
   "Four" ,
   "Five" ,
   "Six" ,
   "Seven" ,
   "Eight" ,
   "Nine"
];

function numbersToLetters(number) {
   var numberString = number.toString();
   for (var i = 0; i < replacementList.length; i++) {
      numberString.replace(i, replacementList[i]);
   }
   return numberString;
};

答案 3 :(得分:0)

请不要你的请求不仅仅是重构,还有一个问题

  

FWIW,考虑到代码在重复的数字上失败,例如输入1111导致One111。 - user2864740

如果使用循环(forwhile ...)可以轻松解决,但更简单:

  • 使用String.prototype.replace
  • 使用RegExp作为您可以设置全局标记的第一个参数:/\d/g
  • 第二个参数也可以是返回替换字符串的函数。

以下是示例:

function numbersToLetters(number) {

    var n = '' + number, r = {
        '1': 'One',
        '2': 'Two',
        '3': 'Three',
        '4': 'Four',
        '5': 'Five',
        '6': 'Six',
        '7': 'Seven',
        '8': 'Eight',
        '9': 'Nine',
        '0': 'Zero'
    };

    return n.replace(/\d/g, function (matched) {
        return r[matched];
    });

}