我有一系列电话号码,我需要查找是否有特定的电话号码。
我最初尝试做的是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()已经有了第二个参数(位置),上面只是说明我需要的东西。
答案 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);
}
工作原理:
然后我们将要搜索的数组转换为字符串(非常快速的操作)。
Á
。它可能是任何不会出现在数组中的东西。[11, 22, 33]
变为字符串:11Á22Á33Á
,例如。
的测试:强>
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
的函数,您可以在其中删除(或添加,具体取决于您的偏好)国家/地区代码以及您不想要的所有其他标志。
之后你可以像现在一样比较它们。