问题示例电话号码



我是一名学习JavaScript的学生。我学习没多久。示例,createPhoneNumber长度最多为11位数字。我这样写了有问题的代码。

function createPhoneNumber(arr) {
let first = '(010)';
if(arr.length === 11){
return `(${arr.slice(0,3).join('')})${arr.slice(3,7).join('')}-${arr.slice(7,11).join('')}`;
}
return `${first}${arr.slice(0,4).join('')}-${arr.slice(4,8).join('')}`;
}

我认为这是非常混乱的代码。

添加一个新变量以使其更短、更简单更好吗?

这可以通过Regex:完成

function createPhoneNumber(arr) {
let first = '(010)';
// the submatch (D)? is intended to get an empty match when the length of arr is not 11
let reg = arr.length == 11 ? /(d{3})(d{4})(d{4})/ : /(D)?(d{4})(d{0,4})(d{0,})/;
return arr.join('').replace(reg, (match, $1, $2, $3) => ($1 ? "(" + $1 + ")" : first) + $2 + "-" + $3);
}
console.log(createPhoneNumber([0,1,0,1,2,3,4,5,6,7,8]));
console.log(createPhoneNumber([1,2,3,4,5,6]));
console.log(createPhoneNumber([1,2,3,4,5,6,7,8,9,0,0,0,0,0]));

你想要它更短更简单吗?这是主观的,但我相信以下适用。此外,我不确定你是否在函数中误用了第11位数字,所以……我用了10。

function createPhoneNumber(arr) {
const arrL = arr.length;
let arrI = arrL - 4;
arr.splice(arrI, 0, "-");
arr.splice(arrI -= 3, 0, ")");
arr.splice(0, 0, arrL === 10 ? "(" : "(010");
return arr.join("");
}

如果只是可读性问题,我建议进行一些更改:

  1. 将硬编码值导出到const
  2. 不要重复您的代码!就像你的复杂return
  3. 它看起来确实很混乱——我决定把数字分成3部分——3个变量,并使用1个return

const PRE_FIRST = '(010)';
const FULL_NUMBER_LENGTH = 11;
function createPhoneNumber(arr) {
let isFullPhone = FULL_NUMBER_LENGTH === arr.length;
let first = isFullPhone ? arr.slice(0, 3).join('') : PRE_FIRST;
let second = (isFullPhone ? arr.slice(3, 7) : arr.slice(0, 4)).join('');
let third = (isFullPhone ? arr.slice(7, 11) : arr.slice(4, 8)).join('');
return `${first}-${second}-${third}`;
}

最新更新