كيف أقوم بتفريغ مصفوفة في JavaScript؟


Answers

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

A.length = 0;
Question

هل هناك طريقة لتفريغ مصفوفة وإذا كان الأمر كذلك ، ربما مع .remove() ؟

على سبيل المثال،

A = [1,2,3,4];

كيف يمكنني تفريغ ذلك؟




هناك الكثير من الارتباك والتضليل فيما يتعلق بالوقت ، أداء البوب ​​/ التحول في كل من الإجابات والتعليقات. الحل أثناء / البوب ​​(كما هو متوقع) أسوأ أداء . ما يحدث في الواقع هو أن الإعداد يعمل مرة واحدة فقط لكل عينة تقوم بتشغيل المقتطف في حلقة. على سبيل المثال:

var arr = [];

for (var i = 0; i < 100; i++) { 
    arr.push(Math.random()); 
}

for (var j = 0; j < 1000; j++) {
    while (arr.length > 0) {
        arr.pop(); // this executes 100 times, not 100000
    }
}

لقد قمت بإنشاء اختبار جديد يعمل بشكل صحيح:

http://jsperf.com/empty-javascript-array-redux

تحذير: حتى في هذا الإصدار من الاختبار ، لا يمكنك رؤية الفرق الحقيقي لأن استنساخ الصفيف يستغرق معظم وقت الاختبار. لا يزال يظهر أن splice هو أسرع طريقة لمسح الصفيف (وليس أخذ [] في الاعتبار لأنه في حين أنه الأسرع فإنه لا يتم في الواقع مسح الصفيف الموجود.




سيكون الحل الأكثر ملاءمة عبر المتصفح والأكثر مثالية هو استخدام طريقة splice لإفراغ محتوى الصفيف A على النحو التالي:

A.splice(0, A.length);




Array.prototype.clear = function() {
    this.length = 0;
};

و نسميها: array.clear();




الأجوبة التي لا تقل عن 2739 من الأصوات المقبولة حتى الآن هي مضللة وغير صحيحة.

السؤال هو: "كيف تفريغ صفيفك الحالي؟" مثلا ل A = [1,2,3,4] .

  1. القول " A = [] هو الجواب" هو جاهل وغير صحيح على الإطلاق. [] == [] غير صحيح .

    هذا لأن هاتين الصفيفتين هما جسمان منفردان منفصلان ، لهما هويتان خاصتان بهما ، وهما يشغلان مساحة خاصة بهما في العالم الرقمي ، كل منهما بمفرده.

لنفترض أن والدتك تطلب منك تفريغ سلة المهملات.

  • لا تجلب واحدة جديدة كما لو كنت قد فعلت ما طلب منك.
  • بدلاً من ذلك ، يمكنك إفراغ سلة المهملات.
  • أنت لا تحل محل واحد معبأ مع علبة فارغة جديدة ، وأنت لا تأخذ التسمية "A" من العلبة المعبأة والتشبث بها الجديدة كما في A = [1,2,3,4]; A = []; A = [1,2,3,4]; A = [];

إفراغ كائن المصفوفة هو أسهل شيء على الإطلاق:

A.length = 0;

بهذه الطريقة ، لا يمكن للعلامة "A" تحت عنوان "A" أن تكون فارغة فحسب ، بل أيضًا نظيفة مثل الجديدة!

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

    while(A.length > 0) {
        A.pop();
    }
    
  2. ولا تضع يدك اليسرى أسفل سلة المهملات ، فضعها في أعلى يمين الصفحة لتتمكن من سحب محتواها كما هو موضح في:

    A.splice(0, A.length);
    

لا ، لقد طُلب منك تفريغها:

A.length = 0;

هذا هو الرمز الوحيد الذي يقوم بإفراغ محتويات صفيف JavaScript محدد بشكل صحيح.




إذا كنت تستخدم الثوابت فلا خيار أمامك:

const numbers = [1, 2, 3]

لا يمكنك إعادة تعيين:

numbers = []

يمكنك فقط اقتطاع:

numbers.length = 0



استخدم أدناه إذا كنت بحاجة إلى إفراغ Angular 2+ FormArray.

public emptyFormArray(formArray:FormArray) {
    for (let i = formArray.controls.length - 1; i >= 0; i--) {
        formArray.removeAt(i);
    }
}



إذا كنت تستخدم

a = []; 

ثم تقوم بتعيين مرجع صفيف جديد إلى ، إذا تم تعيين مرجع بالفعل إلى أي متغير آخر ، فلن يؤدي ذلك إلى إفراغ هذا الصفيف أيضًا ، وبالتالي لن يجمع جامع البيانات المهملة هذه الذاكرة.

على سبيل المثال

var a=[1,2,3];
var b=a;
a=[];
console.log(b);// It will print [1,2,3];

أو

a.length = 0;

عندما نحدد a.length ، نقوم فقط بإعادة تعيين حدود الصفيف والذاكرة لربط عناصر صفيف بقية بواسطة أداة تجميع البيانات المهملة.

بدلاً من هذين المحلين أفضل.

a.splice(0,a.length)

و

while(a.length > 0) {
    a.pop();
}

حسب الإجابة السابقة بواسطة kenshou.html ، الطريقة الثانية أسرع.




أنا مندهش لا أحد اقترح هذا حتى الآن:

let xs = [1,2,3,4];
for (let i in xs)
    delete xs[i];

هذا ينتج صفيف في حالة مختلفة تمامًا عن الحلول الأخرى. بمعنى ، تم إفراغ الصفيف:

xs
=> Array [ <4 empty slots> ]

[...xs]
=> Array [ undefined, undefined, undefined, undefined ]

xs.length
=> 4

xs[0]
=> ReferenceError: reference to undefined property xs[0]

يمكنك إنتاج صفيف مكافئ مع [,,,,] أو Array(4)






Links