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




9 Answers

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

A.length = 0;
javascript arrays

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

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

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

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




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

A.splice(0, A.length);







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

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




إذا كنت مهتمًا بتخصيص الذاكرة ، فيمكنك مقارنة كل طريقة باستخدام شيء مثل jsfiddle بالتزامن مع علامة التبويب الزمني لأدوات chrome dev. ستحتاج إلى استخدام رمز سلة المهملات في الجزء السفلي لفرض مجموعة بيانات المهملة بعد "مسح" الصفيف. يجب أن يمنحك هذا إجابة أكثر تحديدًا للمتصفح الذي تختاره. هناك الكثير من الإجابات هنا قديمة ولن أعتمد عليها ولكن بدلاً من اختبارها في الإجابة على @ tanguy_k أعلاه.

(للمقدمة إلى علامة التبويب المذكورة أعلاه يمكنك التحقق من here )

يجبرني على نسخ jsfiddle حتى هنا هو:

<html>
<script>
var size = 1000*100
window.onload = function() {
  document.getElementById("quantifier").value = size
}

function scaffold()
{
  console.log("processing Scaffold...");
  a = new Array
}
function start()
{
  size = document.getElementById("quantifier").value
  console.log("Starting... quantifier is " + size);
  console.log("starting test")
  for (i=0; i<size; i++){
    a[i]="something"
  }
  console.log("done...")
}

function tearDown()
{
  console.log("processing teardown");
  a.length=0
}

</script>
<body>
    <span style="color:green;">Quantifier:</span>
    <input id="quantifier" style="color:green;" type="text"></input>
    <button onclick="scaffold()">Scaffold</button>
    <button onclick="start()">Start</button>
    <button onclick="tearDown()">Clean</button>
    <br/>
</body>
</html>

ويجب أن تأخذ ملاحظة أنه قد يعتمد على نوع عناصر الصفيف ، حيث يدير javascript السلاسل بشكل مختلف عن الأنواع البدائية الأخرى ، ناهيك عن صفائف الكائنات. قد يؤثر النوع على ما يحدث.




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

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 ، الطريقة الثانية أسرع.




يمكنك بسهولة إنشاء دالة للقيام بذلك نيابة عنك أو تغيير الطول أو حتى إضافته إلى صفيف أصلي كإزالة remove() وظيفة لإعادة الاستخدام.

تخيل أن لديك هذه المجموعة:

var arr = [1, 2, 3, 4, 5]; //the array

حسنًا ، ما عليك سوى تشغيل هذا:

arr.length = 0; //change the length

والنتيجة هي:

[] //result

طريقة سهلة لتفريغ مجموعة ...

أيضا باستخدام حلقة ليست ضرورية ولكن مجرد طريقة أخرى للقيام بذلك:

/* could be arr.pop() or arr.splice(0)
don't need to return as main array get changed */

function remove(arr) {
  while(arr.length) {
    arr.shift(); 
  }
}

هناك أيضًا طريقة صعبة يمكنك التفكير فيها ، على سبيل المثال شيء من هذا القبيل:

arr.splice(0, arr.length); //[]

إذا كان لدى arr 5 عناصر ، فسيؤدي ذلك إلى لصق 5 عناصر من 0 ، مما يعني أن أي شيء سيبقى في الصفيف.

أيضًا طرق أخرى مثل إعادة تعيين الصفيف على سبيل المثال:

arr = []; //[]

إذا نظرت إلى وظائف المصفوفة ، فهناك العديد من الطرق الأخرى للقيام بذلك ، ولكن أكثر ما يوصى به هو تغيير الطول.

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

Array.prototype.remove = Array.prototype.remove || function() {
  this.splice(0, this.length);
};

ويمكنك ببساطة تسمية مثل هذا لتفريغ أي مصفوفة في تطبيق جافا سكريبت الخاص بك:

arr.remove(); //[]



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

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)




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

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





Related