2011-08-12 74 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

我明白這一點。我只是想看看是否有一種方法可以避免消毒整個陣列和比較數字。或者,一個優雅的方式來做到這一點,而不用循環數組。 –