في بعض الأحيان ، يتم مواجهة هذا النوع من المتطلبات ، وتحتاج إلى حذف العناصر المكررة في الصفيف والاحتفاظ بها فقط. الطريقة الأولى التي تتبادر إلى الذهن هي استخدام 2 للحلقات لمقارنة وإزالة العناصر المكررة. الرمز كما يلي:
الطريقة 1:
نسخة الكود كما يلي:
Array.Prototype.distinct = function () {
var arr = [] ،
len = this.length ؛
لـ (var i = 0 ؛ i <len ؛ i ++) {
لـ (var j = i+1 ؛ j <len ؛ j ++) {
إذا (هذا [i] === هذا [J]) {
j = ++ i ؛
}
}
arr.push (هذا [i]) ؛
}
إرجاع arr ؛
} ؛
طريقة الاستخدام 1 إذا واجهت المزيد من البيانات ، فسيكون أدائك أسوأ بكثير. ثم يرجى الاستمرار في رؤية الطريقة التالية.
الطريقة 2:
نسخة الكود كما يلي:
Array.Prototype.distinct = function () {
var self = هذا ،
arr = self.concat (). sort () ؛ // قم بإنشاء صفيف جديد وفرزه
arr.sort (وظيفة (a ، b) {
if (a === b) {
var n = self.indexof (a) ؛ // الحصول على قيمة الفهرس
self.splice (n ، 1) ؛
}
}) ؛
إرجاع النفس
} ؛
تستخدم الطريقة 2 وظيفة رد الاتصال المخصص من الفرز ، وتستخدم أيضًا IndexOF ، وهي طريقة غير مدعومة بواسطة IE6/7/8. بالطبع ، يمكن محاكاة IndexOF بمفرده ، ولكن المشكلة الأكبر هي أن هناك أيضًا فرقًا بين طريقة فرز IE6/7/8 والمتصفح القياسي. هناك العديد من المصائد في وظائف رد الاتصال المخصصة التي تستخدم طريقة الفرز في IE6/7/8. سوف تقوم رمز وظيفة رد الاتصال المخصصة أعلاه بالإبلاغ مباشرة عن خطأ "الرقم المفقود" في IE6/7/8. إذا كانت وظيفة رد الاتصال تُرجع NAN ، فسيتم الإبلاغ عن هذا الخطأ ، لأنه من الناحية النظرية ، يمكن أن تُرجع وظيفة رد الاتصال فقط أعداد صحيحة. حتى إذا تم تجاهل قيمة الإرجاع ، فلا تزال هناك مشاكل أخرى ، وفي النهاية ، لا توجد مشكلة كبيرة. الطريقة 2 لن تعمل في IE6/7/8.
من رصيف كذبة ، إليك رمزه:
نسخة الكود كما يلي:
Array.Prototype.Delrepeat = function () {
var newarray = [] ؛
var sucentionaltable = {} ؛
لـ (var i = 0 ، item ؛ (item = this [i])! = null ؛ i ++) {
if (! provisionaltable [item]) {
newarray.push (عنصر) ؛
التوتر القابلة للتوفير [البند] = صواب ؛
}
}
إرجاع نياراي
} ؛
تستخدم الطريقة 3 كائنًا مؤقتًا لتخزين عناصر الصفيف. إذا واجهت عناصر صفيف مكررة ، فسيتم تجاهلها. ومع ذلك ، إذا واجهت الصفيف التالي:
نسخة الكود كما يلي:
var arr = ['Firefox' ، 1 ، '1'] ؛
إذا تم استخدام الصفيف أعلاه في الطريقة 3 ، فسيتم حذفه عن طريق الخطأ 1 و "1" كعناصر مكررة ، لذلك يمكن حل القليل من التعديل للطريقة 3.
نسخة معدلة من الطريقة 3:
نسخة الكود كما يلي:
Array.Prototype.distinct = function () {
var arr = [] ،
OBJ = {} ،
أنا = 0 ،
len = this.length ،
نتيجة؛
لـ (؛ i <len ؛ i ++) {
النتيجة = هذا [i] ؛
if (obj [result]! == نتيجة) {
arr.push (نتيجة) ؛
OBJ [النتيجة] = النتيجة ؛
}
}
إرجاع arr ؛
} ؛
في وقت لاحق قرأت التعليقات في نهاية المقال عن Fools Wharf. هذه الطريقة هي نفس الطريقة التي توفرها Rekey ، ولكن هذه الطريقة تحتوي أيضًا على أخطاء. إذا واجهت مثل هذه الصفيف 2B ، فستكون بخير:
نسخة الكود كما يلي:
var arr = ['Firefox' ، 1 ، '1' ، 1] ؛
يتم تعديل الصفيف أعلاه مع الطريقة 3 ، ولن يتم حذف العناصر الثلاثة الأخيرة. ومع ذلك ، فإن هذا النوع من الصفيف متطرف بعض الشيء. إذا واجهت بيانات بنفس الحجم الحرفي وعدد الأوتار ، فيجب معالجتك مسبقًا لتجنب هذا الخطأ. طريقة استخدام الكائنات المؤقتة أسرع قليلاً من الفرز في المتصفحات القياسية ، ويجب أن تكون الخوارزميات من طريقة الفرز مختلفة أيضًا في كل متصفح.