2011-08-12 60 views
1

我有一个电话号码数组,我需要查找是否有特定的电话号码。 我最初尝试做的是if(arr.indexOf(phoneNumber) != -1) { bla.. }。它有效 - 有时候。
我后来发现,由于号码会从不同的电话/登记表中得到,有些人使用国家代码(如+ 1-xxx-xxx-xxxx),有些人不会。有些使用空格作为分隔符,有些使用连续10个数字。总之 - 地狱来比较。比较JavaScript中的电话号码

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

在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中存在,但可以有人建议的东西优雅达到预期的结果?

一如既往,感谢您的时间。我知道indexOf()已经有了第二个参数(position),上面只是为了说明我需要什么。

+0

我会建议寻找到谷歌的电话号码处理库:http://code.google.com/p/libphonenumber/ –

+0

感谢詹姆斯。看起来像一个很酷的图书馆,但也许是一个很大的小问题:) –

+0

上面的例子将运行一个循环,并且每行运行removeAllSeperators函数2次,如果您自己编写循环,则运行速度会更快,然后使用一个函数,使循环,什么是如此糟糕的惠特循环? –

回答

0

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

但现在,这里是你问什么:

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)然后在末尾之前去掉任何数字。
  2. 然后我们将要搜索的数组转换为字符串(非常快的操作)。

    1. 加入数组时,我们使用一些字符来分隔每个条目。
    2. 它必须是我们有理由确定永远不会出现在数组中的字符。在这种情况下,我们选择了Á。它可能是任何不会出现在阵列中的东西。
    3. 因此,一个数组:[11, 22, 33]成为一个字符串:11Á22Á33Á,例如。
  3. 最后的正则表达式,然后搜索紧接着由我们的标记字符目标数 - 这标志着每个条目的末尾。这确保了只有数组的最后10位数字针对10位数目标进行检查。


测试:

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 
+0

嗨布罗克。谢谢!我将使用你的代码,如果你可以解释'Á'chaacter是什么:) –

+0

'Á'字符只是一个任意的“安全”分隔符。我已经更新了答案,试图更好地解释它。 –

+0

它只适用于美国电话号码格式,其中国家代码只有1位数(1),不适用于国家代码有2位或3位数字 –

0

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

只需创建一个名为sanitizePhonenumber的功能,您可以在其中去除(或添加,取决于您的偏好)国家代码以及您不想要的所有其他标志。

之后,你可以比较他们,因为你现在正在做。

+0

我明白这一点。我只是想看看是否有一种方法可以避免消毒整个阵列和比较数字。或者,一个优雅的方式来做到这一点,而不用循环数组。 –