Сравните номера телефонов в JavaScript - PullRequest
1 голос
/ 12 августа 2011

У меня есть массив телефонных номеров, и мне нужно выяснить, есть ли в нем конкретный номер телефона. Сначала я попытался сделать if(arr.indexOf(phoneNumber) != -1) { bla.. }. И это работало - иногда.
Позже я обнаружил, что, поскольку число / числа будут приходить с разных телефонов / форм ввода, некоторые люди используют коды стран (например, + 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, но может ли кто-нибудь предложить что-то short и элегантный , которое достигает желаемого результата?

Как всегда, спасибо за ваше время.

PS: я знаю, что у indexOf () уже есть второй параметр (позиция), приведенное выше просто иллюстрирует то, что мне нужно.

Ответы [ 2 ]

1 голос
/ 12 августа 2011

Вы действительно должны очистить все данные, как при сборе, так и в БД.

Но сейчас вот что вы просили:

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-значному целевому элементу.


Проверка:

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 голосов
/ 12 августа 2011

Вы должны санировать как входные, так и все значения массива, чтобы убедиться, что они соответствуют одному и тому же набору правил.

Просто создайте функцию с именем sanitizePhonenumber, в которой вы удаляете (или добавляете, в зависимости от ваших предпочтений) код страны и все другие знаки, которые вам там не нужны.

После этого вы можете просто сравнить их, как вы делаете сейчас.

...