比较JavaScript中的电话号码

时间:2011-08-12 07:52:07

标签: javascript comparison phone-number

我有一系列电话号码,我需要查找是否有特定的电话号码。 我最初尝试做的是if(arr.indexOf(phoneNumber) != -1) { bla.. }。它有效 - 有时候 我后来发现,由于数字/ s将来自不同的电话/报名表,有些人使用国家代码(如+ 1-xxx-xxx-xxxx),有些则不会。有些人使用空格作为分隔符,有些只使用10位数字。简而言之 - 要比较。

我需要的是一个优雅的解决方案,可以让我进行比较,希望无需复制或更改原始数组。

在C ++中,您可以定义比较运算符。我设想我的解决方案就像这个伪代码,希望使用一些聪明的正则表达式:

function phoneNumberCompare(a, b) {
    a = removeAllSeperators(a); //regex??
    a = a.substring(a.length, a.length - 10);
    b = removeAllSeperators(b); //regex??
    b = b.substring(b.length, b.length - 10);
    return (a < b ? -1 : (a == b ? 0 : 1));  //comaprison in C++ returns -1, 0, 1
}

并像if(arr.indexOf(phoneNumber, phoneNumberCompare) != -1)

一样使用它

现在,我知道JavaScript中不存在类似此构造的解决方案,但是有人可以建议简短优雅来实现所需的结果吗?

一如既往,谢谢你的时间。

PS:我知道indexOf()已经有了第二个参数(位置),上面只是说明我需要的东西。

2 个答案:

答案 0 :(得分:1)

你真的应该清理收集和数据库中的所有数据。

但就目前而言,这就是你要求的:

function bPhoneNumberInArray (targetNum, numArray) {
  var targSanitized   = targetNum.replace (/[^\d]/g, "")
                                 .replace (/^.*(\d{10})$/, "$1");
  //--- Choose a character that is unlikely to ever be in a valid entry.
  var arraySanitized  = numArray.join ('Á').replace (/[^\dÁ]/g, "") + 'Á';

  //--- Only matches numbers that END with the target 10 digits.
  return (new RegExp (targSanitized + 'Á') ).test (arraySanitized);
}                                    


工作原理:

  1. 第一个语句从目标号码中删除除数字(0-9)之外的所有内容,然后在最后 10位数之前删除任何内容。
  2. 然后我们将要搜索的数组转换为字符串(非常快速的操作)。

    1. 加入数组时,我们使用一些字符来分隔每个条目。
    2. 它必须是我们相当肯定永远不会出现在数组中的角色。在这种情况下,我们选择了Á。它可能是任何不会出现在数组中的东西。
    3. 因此,数组:[11, 22, 33]变为字符串:11Á22Á33Á,例如。
  3. 最终的正则表达式,然后搜索目标数字,紧跟我们的标记字符 - 这标志着每个条目的结束。这样可以确保仅针对10位数目标检查数组编号的最后10位数字。

  4. 测试:

    var numArray = ['0132456789', "+14568794324", "123-456-7890"];
    
    bPhoneNumberInArray ("+1-456-879-4324", numArray)      // true
    bPhoneNumberInArray ("+14568794324", numArray)         // true
    bPhoneNumberInArray ("4568794324", numArray)           // true
    bPhoneNumberInArray ("+145 XXX !! 68794324", numArray) // true !
    bPhoneNumberInArray ("+1-666-879-4324", numArray)      // false
    

答案 1 :(得分:0)

您应该清理输入和所有数组值,以确保它们符合相同的规则集。

只需创建一个名为sanitizePhonenumber的函数,您可以在其中删除(或添加,具体取决于您的偏好)国家/地区代码以及您不想要的所有其他标志。

之后你可以像现在一样比较它们。