كتابة وظيفة التحقق من صحة الرمز البريدي لجافا سكريبت

StackOverflow https://stackoverflow.com/questions/613316

سؤال

أود أن أكتب أ جافا سكريبت وظيفة تتحقق من صحة الرمز البريدي، عن طريق التحقق من وجود الرمز البريدي بالفعل.فيما يلي قائمة بجميع الرموز البريدية:

http://www.census.gov/tiger/tms/gazetteer/zips.txt (أنا أهتم فقط بالعمود الثاني)


هذه حقا مشكلة ضغط.أود أن أفعل هذا من أجل المتعة.حسنًا، لقد انتهى الأمر الآن، إليك قائمة بالتحسينات على جدول التجزئة المباشر الذي يمكنني التفكير فيه، ولا تتردد في إضافة أي شيء لم أفكر فيه:

  • قم بتقسيم الرمز البريدي إلى جزأين، أول رقمين وآخر 3 أرقام.
  • قم بعمل عبارة if-else عملاقة أولاً عن طريق التحقق من أول رقمين، ثم التحقق من النطاقات ضمن آخر 3 أرقام.
  • أو قم بإخفاء السحابات في شكل سداسي، وأرى ما إذا كان بإمكاني فعل الشيء نفسه باستخدام مجموعات أصغر.
  • اكتشف ما إذا كان هناك رموز بريدية صالحة ضمن نطاق جميع الرموز البريدية الصالحة مقابل الرموز البريدية غير الصالحة.اكتب الكود أعلاه مستهدفًا المجموعة الأصغر.
  • قم بتقسيم التجزئة إلى ملفات منفصلة، ​​وقم بتحميلها عبر Ajax أثناء كتابة المستخدم في الرمز البريدي.لذلك ربما يتم تقسيمها إلى جزأين، الأول لأول رقمين، والثاني لآخر 3 أرقام.

وأخيرًا، أخطط لإنشاء ملفات JavaScript باستخدام برنامج آخر، وليس يدويًا.

يحرر:الأداء مهم هنا.أريد استخدام هذا إذا لم يكن سيئًا.أداء تنفيذ كود JavaScript + وقت التنزيل.

تحرير 2:حلول جافا سكريبت فقط من فضلك.ليس لدي إمكانية الوصول إلى خادم التطبيقات، بالإضافة إلى أن ذلك من شأنه أن يجعل هذا مشكلة أخرى تمامًا =)

هل كانت مفيدة؟

المحلول

أرغب في كتابة وظيفة JavaScript للتحقق من صحة الرمز البريدي

قد يكون الأمر مجهودًا أكثر مما يستحق، فالمحافظة على تحديثه بحيث لا يتم رفض الرمز البريدي الحقيقي الصالح لأي شخص في أي وقت.يمكنك أيضًا تجربة خدمة خارجية، أو القيام بما يفعله الآخرون وقبول أي رقم مكون من 5 أرقام!

فيما يلي قائمة بالتحسينات على جدول التجزئة المباشر الذي يمكنني التفكير فيه

نأسف لإفساد المتعة المحتملة، ولكن ربما لن تتمكن من إدارة أداء فعلي أفضل بكثير مما يوفره لك كائن JavaScript عند استخدامه كجدول تجزئة.يعد الوصول إلى أعضاء الكائن أحد أكثر العمليات شيوعًا في JS وسيتم تحسينه بشكل فائق؛من غير المرجح أن ينجح بناء هياكل البيانات الخاصة بك في التغلب عليها حتى لو كانت هياكل أفضل من وجهة نظر علوم الكمبيوتر.على وجه الخصوص، أي شيء يستخدم "Array" لن يؤدي الأداء الجيد الذي تعتقده لأن Array يتم تنفيذه فعليًا ككائن (قابل للتجزئة) بحد ذاته.

بعد قولي هذا، فإن أداة ضغط المساحة المحتملة إذا كنت تحتاج فقط إلى معرفة "صالح أم لا" ستكون استخدام حقل بت 100000 بت، معبأة في سلسلة.على سبيل المثال، لمساحة مكونة من 100 رمز بريدي فقط، حيث تكون الرموز 032-043 "صالحة":

var zipfield= '\x00\x00\x00\x00\xFF\x0F\x00\x00\x00\x00\x00\x00\x00';
function isvalid(zip) {
    if (!zip.match('[0-9]{3}'))
        return false;
    var z= parseInt(zip, 10);
    return !!( zipfield.charCodeAt(Math.floor(z/8)) & (1<<(z%8)) );
}

الآن علينا فقط إيجاد الطريقة الأكثر فعالية لتوصيل حقل البت إلى البرنامج النصي.الإصدار الساذج المملوء بـ '\x00' أعلاه غير فعال إلى حد ما.الأساليب التقليدية للحد من ذلك ستكون على سبيل المثال.لتشفير base64:

var zipfield= atob('AAAAAP8PAAAAAAAAAA==');

سيؤدي ذلك إلى خفض 100000 علامة إلى 16.6 كيلو بايت.لسوء الحظ، فإن atob هو برنامج Mozilla فقط، لذا ستكون هناك حاجة إلى وحدة فك ترميز Base64 إضافية للمتصفحات الأخرى.(الأمر ليس صعبًا للغاية، ولكنه يستغرق وقتًا أطول قليلاً لبدء التشغيل لفك التشفير.) قد يكون من الممكن أيضًا استخدام طلب AJAX لنقل سلسلة ثنائية مباشرة (مشفرة بنص ISO-8859-1 إلى نص الاستجابة).سيؤدي ذلك إلى وصوله إلى 12.5 كيلو بايت.

ولكن في الواقع ربما أي شيء، حتى الإصدار الساذج، سيفي بالغرض طالما أنك تخدم البرنامج النصي باستخدام mod_deflate، الأمر الذي من شأنه أن يضغط الكثير من هذا التكرار، وكذلك تكرار '\x00' لجميع النطاقات الطويلة من 'غير صالح' رموز.

نصائح أخرى

يمكنك فعل ما لا يمكن تصوره والتعامل مع الكود كرقم (تذكر أنه ليس رقمًا في الواقع).قم بتحويل قائمتك إلى سلسلة من النطاقات، على سبيل المثال:

zips = [10000, 10001, 10002, 10003, 23001, 23002, 23003, 36001]
// becomes
zips = [[10000,10003], [23001,23003], [36001,36001]]
// make sure to keep this sorted

ثم للاختبار:

myzip = 23002;
for (i = 0, l = zips.length; i < l; ++i) {
    if (myzip >= zips[i][0] && myzip <= zips[i][1]) {
        return true;
    }
}
return false;

هذا مجرد استخدام بحث خطي ساذج جدًا (O(n)).إذا احتفظت بالقائمة مرتبة واستخدمت البحث الثنائي، فيمكنك تحقيق O(log n).

أنا أستعمل واجهة برمجة تطبيقات خرائط جوجل للتحقق من وجود الرمز البريدي.

إنها أكثر دقة.

بافتراض أنك حصلت على الملفات المضغوطة في مصفوفة مرتبة (يبدو الأمر عادلاً إذا كنت تتحكم في إنشاء بنية البيانات)، تحقق مما إذا كان البحث الثنائي البسيط سريعًا بدرجة كافية.

لذا...هل تقوم بالتحقق من جانب العميل وتريد تحسين حجم الملف؟ربما لا يمكنك التغلب على الضغط العام.لحسن الحظ، تدعم معظم المتصفحات gzip، لذا يمكنك استخدام هذا القدر مجانًا.

ماذا عن إملاء أو قائمة بسيطة مشفرة بـ json تحتوي على الرموز البريدية بترتيب فرزها وإلقاء نظرة على الإملاء.سيتم ضغطه جيدًا، نظرًا لأنه تسلسل يمكن التنبؤ به، ويتم استيراده بسهولة نظرًا لأنه json، وذلك باستخدام المحلل اللغوي المدمج في المتصفحات، ومن المحتمل أن يكون البحث سريعًا جدًا أيضًا، نظرًا لأن هذا هو برنامج جافا سكريبت البدائي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top