فيما يلي مقالة بسيطة حول بعض النصائح حول استخدام صفائف JavaScript. سنستخدم طرقًا مختلفة لدمج/دمج صفيفتين JS ، وكذلك مناقشة مزايا/عيوب كل طريقة.
لننظر في الموقف التالي أولاً:
var a = [1 ، 2 ، 3 ، 4 ، 5 ، 6 ، 7 ، 8 ، 9] ؛ var b = ["foo" ، "bar" ، "baz" ، "bam" ، "Bun" ، "fun"] ؛
من الواضح أن أبسط نتيجة مجموعة يجب أن تكون:
[1 ، 2 ، 3 ، 4 ، 5 ، 6 ، 7 ، 8 ، 9 ، "Foo" ، "Bar" ، "Baz" ، "Bam" "Bun" ، "Fun"]
Concat (..)
هذه هي الممارسة الأكثر شيوعًا:
var c = a.concat (b) ؛ a ؛ // [1،2،3،4،5،6،7،8،9] b ؛ // ["foo" ، "bar" ، "baz" ، "Bam" ، "Bun" ، "Fun"] c ؛ // [1،2،3،4،5،7،8،9 ، "foo" ، "bar" ، "baz" ، "bam" ،
كما ترون ، فإن C عبارة عن صفيف جديد يمثل مزيجًا من صفيفتين A و B ويبقي A و B ثابتًا. بسيط؟
ولكن إذا كان A 10000 عنصر و B لديه 10000 عنصر؟ سيكون لـ C 20.000 عنصر ، وبالتالي فإن استخدام ذاكرة A و B سوف يتضاعف.
"لا مشكلة!" أنت قلت. دعهم يتم جمع القمامة ، وضبط A و B إلى NULL ، يتم حل المشكلة!
a = b = null ؛ // "A" و "B" يتم إعادة تدويرها
هيه. بالنسبة للصفائف الصغيرة مع عدد قليل من العناصر ، هذا جيد. ولكن بالنسبة للصفائف الكبيرة ، أو الأنظمة ذات الذاكرة المحدودة ، يجب تكرار هذه العملية بشكل متكرر ، فهي تحتوي بالفعل على العديد من التحسينات.
إدراج حلقة
حسنًا ، دعنا ننسخ محتويات صفيف إلى آخر ، باستخدام: Array#push (..)
// `b` على` a`for (var i = 0 ؛ i <b.length ؛ i ++) {A.Push (b [i]) ؛} a ؛ // [1،2،3،4،5،7،7،9،9 ، "foo" ، "bar" ، "baz" ، "bam" ،الآن ، Array A لديه محتويات Array B.
يبدو أن هناك بصمة ذاكرة أفضل.
ولكن ماذا لو كانت الصفيف أ أصغر؟ لأسباب الذاكرة والسرعة ، قد ترغب في وضع أصغر A أمام B ،. لا مشكلة ، فقط قم بتغيير الضغط (..) إلى عدم الانهيار (..):
// `a` في" b`: for (var i = A.Length-1 ؛ i> = 0 ؛ i--) {B.Unshift (a [i]) ؛} b ؛ // [1،2،3،4،5،7،8،9 ، "foo" ، "bar" ، "baz" ، "bam" ،المهارات الوظيفية
ومع ذلك ، فإن الحلقة من أجل القبيحة وصعبة في الواقع. هل يمكننا أن نفعل ما هو أفضل؟
هذه هي محاولتنا الأولى ، باستخدام Array#تقليل:
// `b` على` a`: a = b.reduce (function (coll ، item) {coll.push (item) ؛ return coll ؛} ، a) ؛ a ؛ ] // [1،2،3،4،5،7،8،9 ، "foo" ، "bar" ، "baz" ، "bam" ،صفيف#تقليل (..) و Array#التخفيض (..) لطيفة ، لكنها خرقاء بعض الشيء. ستؤدي وظيفة السهم لـ ES6 => إلى تقليل كمية التعليمات البرمجية ، لكنها لا تزال تتطلب وظيفة ، ويجب استدعاء كل عنصر مرة واحدة ، وهو أمر غير مثالي.
إذن ماذا عن هذا:
// `b` على` a`: a.push.apply (a ، b) ؛ a ؛ ] // [1،2،3،4،5،7،8،9 ، "foo" ، "bar" ، "baz" ، "bam" ،
هل هذا مكان أفضل بكثير؟ خاصة وأن طريقة UNSHIFT (..) لا داعي للقلق بشأن الفرز العكسي السابق هنا. ستكون عملية خطاب ES6 أكثر جمالًا: A.Push (... B) أو B.Unshift (...
الحد الأقصى للطول للمصفوفة
المشكلة الرئيسية الأولى هي أن زوجي استخدام الذاكرة (مؤقت فقط بالطبع!) هو نسخ العناصر في الأساس إلى المكدس عبر مكالمات الوظائف. بالإضافة إلى ذلك ، فإن محركات JS المختلفة لها قيود على طول بيانات النسخ.
لذلك ، إذا كانت الصفيف بها مليون عنصر ، فستكون بالتأكيد خارج الحد الذي يدفعه (...) أو غير مفهوم (...) يتيح مكدس المكالمات. للأسف ، ستقوم بعمل رائع في التعامل مع الآلاف من العناصر ، ولكن عليك أن تكون حريصًا على عدم تجاوز الحد المعقول للطول.
ملاحظة: يمكنك تجربة لصق (...) ، والتي لديها نفس المشكلة مثل Push (...) و Unsonshift (...).
هناك طريقة لتجنب هذا الحد الأقصى للطول.
وظيفة combineInto (a ، b) {var len = A.Length ؛ لـ (var i = 0 ؛ i <len ؛ i = i+5000) {B.Unshift.apply (b ، a.slice (i ، i+5000)) ؛ }}انتظر ، لقد ذهب قابلية القراءة إلى الوراء. مثل هذا ، قد يزداد الأمر أسوأ وأسوأ.
ما سبق هو كل شيء عن هذا المقال ، آمل أن يكون من المفيد للجميع تعلم برمجة JavaScript.