मैं जावास्क्रिप्ट में एक सरणी कैसे खाली कर सकता हूँ?


2197

वहाँ एक सरणी खाली करने के लिए एक रास्ता है और यदि ऐसा है तो संभवतः .remove()?

उदाहरण के लिए,

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

मैं उसे कैसे खाली कर सकता हूं?


1
यहाँ विभिन्न संभावनाओं के साथ एक बेंचमार्क: jsben.ch/#/7QyI1
एस्केपनेटस्केप

जवाबों:


4412

मौजूदा सरणी को खाली करने के तरीके A:

विधि 1

(यह प्रश्न का मूल उत्तर था)

A = [];

यह कोड चर Aको एक नए खाली सरणी में सेट करेगा । यह सही है यदि आपके पास मूल सरणी के संदर्भA कहीं और नहीं हैं क्योंकि यह वास्तव में एक नया (खाली) सरणी बनाता है। आपको इस विधि से सावधान रहना चाहिए क्योंकि यदि आपने किसी अन्य चर या संपत्ति से इस सरणी को संदर्भित किया है, तो मूल सरणी अपरिवर्तित रहेगी। केवल इसका उपयोग करें यदि आप केवल इसके मूल चर द्वारा सरणी को संदर्भित करते हैं A

यह भी सबसे तेज उपाय है।

यह कोड नमूना इस पद्धति का उपयोग करते समय आपके द्वारा सामना की जा सकने वाली समस्या दिखाता है:

var arr1 = ['a','b','c','d','e','f'];
var arr2 = arr1;  // Reference arr1 by another variable 
arr1 = [];
console.log(arr2); // Output ['a','b','c','d','e','f']

विधि 2 (as मैथ्यू क्रुमले द्वारा सुझाई गई )

A.length = 0

यह इसकी लंबाई को 0. पर सेट करके मौजूदा सरणी को साफ कर देगा। कुछ ने तर्क दिया है कि यह जावास्क्रिप्ट के सभी कार्यान्वयन में काम नहीं कर सकता है, लेकिन यह पता चलता है कि यह मामला नहीं है। यह ECMAScript 5 में "सख्त मोड" का उपयोग करते समय भी काम करता है क्योंकि किसी सरणी की लंबाई गुण पढ़ने / लिखने की संपत्ति है।

विधि 3 (जैसा कि सुझाव दिया गया है कि एंथनी द्वारा गया है )

A.splice(0,A.length)

का उपयोग करना .splice()पूरी तरह से काम करेगा, लेकिन चूंकि .splice()फ़ंक्शन सभी हटाए गए आइटमों के साथ एक सरणी लौटाएगा, यह वास्तव में मूल सरणी की एक प्रति वापस कर देगा। बेंचमार्क बताते हैं कि इससे प्रदर्शन पर कोई प्रभाव नहीं पड़ता है।

विधि 4 (जैसा कि सुझाव दिया गया है tanguy_k )

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

यह समाधान बहुत रसीला नहीं है, और यह सबसे धीमा समाधान भी है, जो मूल उत्तर में पहले के बेंचमार्क के विपरीत है।

प्रदर्शन

मौजूदा सरणी को साफ़ करने के सभी तरीकों में से , विधि 2 और 3, प्रदर्शन में बहुत समान हैं और विधि की तुलना में बहुत तेज़ हैं। यह बेंचमार्क देखें । ।

जैसा कि उनके उत्तर में डायडिस्टिस ने बताया है नीचे दिए गए , मूल बेंचमार्क जो ऊपर वर्णित चार तरीकों के प्रदर्शन को निर्धारित करने के लिए उपयोग किए गए थे। मूल बेंचमार्क ने साफ़ किए गए सरणी का पुन: उपयोग किया इसलिए दूसरा पुनरावृत्ति एक सरणी को साफ़ कर रहा था जो पहले से ही खाली था।

निम्नलिखित बेंचमार्क इस दोष को ठीक करता है: http://jsben.ch/#/hyj65 । यह स्पष्ट रूप से दिखाता है कि तरीके # 2 (लंबाई संपत्ति) और # 3 (ब्याह) सबसे तेज़ हैं (मतगणना विधि # 1 जो मूल सरणी को नहीं बदलता है)।


यह एक गर्म विषय रहा है और बहुत विवाद का कारण रहा है। वास्तव में कई सही उत्तर हैं और क्योंकि यह उत्तर बहुत लंबे समय के लिए स्वीकृत उत्तर के रूप में चिह्नित किया गया है, मैं यहां सभी विधियों को शामिल करूंगा। यदि आप इस उत्तर के लिए मतदान करते हैं, तो कृपया अन्य उत्तरों को भी देखें जिन्हें मैंने संदर्भित किया है।


183
while (A.length) { A.pop(); }, कोई ज़रूरत नहीं है> 0
इवान ब्लैक

327
> 0अधिक पठनीय IMHO है। और दोनों के बीच कोई प्रदर्शन अंतर नहीं है।
फिलिप लेबेर्ट

10
@ दादन, यह बिल्कुल स्पष्ट नहीं है कि आप क्या कहना चाह रहे हैं। एक नया असाइन किए bजाने के बाद भी पुराने सरणी का संदर्भ रखता है acऔर dउसी सरणी को संदर्भित करना जारी रखें। इसलिए आउटपुट में अंतर अपेक्षित है।
शोवनिक

9
@DiegoJancic विधि # 1 की गणना नहीं है क्योंकि यह सरणी को साफ़ नहीं करता है। यह एक नया सृजन करता है। इसे एक बेंचमार्क में शामिल नहीं किया जाना चाहिए।
फिलिप लेबेर्ट

44
यदि while(A.pop())सरणी में कोई आइटम गलत है तो आप उपयोग नहीं कर सकते । उदाहरण के लिए A = [2, 1, 0, -1, -2] का परिणाम A के बराबर होगा [2, 1]। यहां तक ​​कि while(A.pop() !== undefined)काम नहीं करता है क्योंकि आप मूल्यों में से एक के रूप में अपरिभाषित के साथ एक सरणी रख सकते हैं। शायद क्यों संकलक ने इसे अनुकूलित नहीं किया है।
जोनाथन ग्राईच

2458

यदि आपको मूल सारणी रखने की आवश्यकता है क्योंकि आपके पास इसके अन्य संदर्भ हैं जिन्हें अद्यतन भी किया जाना चाहिए, तो आप इसकी लंबाई शून्य पर सेट करके एक नया सरणी बनाए बिना इसे खाली कर सकते हैं:

A.length = 0;

17
ECMAScript 5 मानक इस बारे में क्या कहता है?
पचेरियर

212
@ स्पेसर: यह अभी भी ES5 में काम करता है। धारा 15.4 से: "... जब भी लंबाई की संपत्ति बदली जाती है, प्रत्येक संपत्ति जिसका नाम एक सरणी इंडेक्स होता है, जिसका मान नई लंबाई से छोटा नहीं होता है, स्वचालित रूप से हटा दिया जाता है"
मैथ्यू क्रूले

2
@ सेमिनार: आपके द्वारा जो कुछ भी रखा जाता है, उसमें फिट होने के लिए जावास्क्रिप्ट सरणियों का हमेशा विस्तार होता है, इसलिए जब आप myarray.push(whatever)इसे कहते हैं तो यह लंबाई में एक जोड़ देता है। इसलिए लंबाई सेट करना सरणी को छोटा करता है, लेकिन यह स्थायी नहीं है।
मैथ्यू क्रुमले

12
@LosManos यहां तक ​​कि सख्त मोड में, lengthएक विशेष संपत्ति है, लेकिन केवल पढ़ा नहीं जाता है, इसलिए यह अभी भी काम करेगा।
मैथ्यू क्रुमले

11
@MattewCrumley मैंने कुछ परीक्षण किया, और ऐसा लगता है कि a.length = 0 कुशल पूरे समाशोधन को सक्षम करने के लिए नहीं है। jsperf.com/length-equal-0-or-new-array मुझे लगता है कि अगर आपके पास एक रिफेंस है (और आपने अतिरिक्त गुण नहीं जोड़े हैं जिन्हें आप रखना चाहते हैं), तो नई सरणी बनाना बेहतर है, और बनाने के लिए पुराने छोड़ देता है कचरा बीनने वाला, उचित होने पर चलेगा।
पॉल ब्रेवस्कीस्की

289

यहाँ सबसे तेजी से काम कर रहा कार्यान्वयन , जबकि एक ही सरणी रखने ( "परिवर्तनशील"):

function clearArray(array) {
  while (array.length) {
    array.pop();
  }
}

FYI करें इसे सरल नहीं किया जा सकता है while (array.pop()) : परीक्षण विफल हो जाएंगे।

FYI करें मानचित्र और सेट परिभाषित clear(), यह Array केclear() लिए तार्किक प्रतीत होगा भी।

टाइपस्क्रिप्ट संस्करण:

function clearArray<T>(array: T[]) {
  while (array.length) {
    array.pop();
  }
}

इसी परीक्षण:

describe('clearArray()', () => {
  test('clear regular array', () => {
    const array = [1, 2, 3, 4, 5];
    clearArray(array);
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });

  test('clear array that contains undefined and null', () => {
    const array = [1, undefined, 3, null, 5];
    clearArray(array);
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });
});

यहां अपडेट किए गए jsPerf: http://jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152


5
टीटी आपका उत्तर एकमात्र ऐसा है जो सही और तेज़ (एक ही समय में) है, लेकिन कुछ बहुत कम "अपवोट्स" है। ठीक है, ऐसा लगता है कि लोग सुंदर समाधान पसंद करते हैं जो धीमे हैं: /
obenjiro

@naomik लेकिन यह मूलभूत क्रियाओं में से एक है, जिसे डिफ़ॉल्ट रूप से होना चाहिए था।
Thefourtheye

7
@thefourtheye प्रदर्शन के लिए अच्छा समाधान, हालांकि मैं @naomik से सहमत हूं, आपको देशी वस्तुओं को संशोधित नहीं करना चाहिए। यह कहते हुए कि यह होना चाहिए बिंदु के पास है, समस्या यह है कि आप ग्लोबल्स को संशोधित कर रहे हैं , जो खराब है। यदि आप अपना कोड दूसरों को उपयोग करने के लिए प्रदान कर रहे हैं, तो इसका कोई अप्रत्याशित दुष्प्रभाव नहीं होना चाहिए। सोचिए अगर किसी अन्य लाइब्रेरी ने भी संशोधन किया Array.prototypeऔर वह कुछ अलग कर रही है, तो आपके पूरे कोड [].clear()में कुछ गलत था। यह डिबग करने के लिए मजेदार नहीं होगा। तो, सामान्य संदेश है: ग्लोबल्स को संशोधित न करें।
जेपिलोरा

3
@thefourtheye ग्लोबल स्कोप को संशोधित नहीं करने का पूरा बिंदु यह है क्योंकि आपको यह नहीं पता होगा कि किसी और का कोड पहले से है (या होगा) नाम का उपयोग करके। मैं स्थानीय कार्यक्षेत्र के अंदर कार्य करने का सुझाव देता हूं। तो, अपने आवेदन / पुस्तकालय के IIFE के अंदर , करें function clear(arr) { while(arr.length) arr.pop(); }, फिर के clear(arr)बजाय के साथ स्पष्ट सरणियाँ arr.clear()
जेपिलोरा

2
यह पता चला है कि इस विधि की तुलना में बहुत धीमी है .splice()और .length=0। बेंचमार्क सही नहीं थे। देखिये मेरा अपडेटेड जवाब।
फिलिप लेबेर्ट

216

एक अधिक क्रॉस-ब्राउज़र अनुकूल और अधिक इष्टतम समाधान नीचे spliceए के रूप में ए की सामग्री को खाली करने के लिए विधि का उपयोग करना होगा :

A.splice(0, A.length);


49
यह अधिक क्रॉस-ब्राउज़र अनुकूल क्यों है? ब्राउज़रों के पास A.length के साथ क्या समस्याएँ हैं?
stricjux

4
@ jm2 आप जो कह रहे हैं, वह पूरी तरह सच नहीं है। यह वास्तव में सरणी को संशोधित करता है और बाद में सभी संदर्भ प्रभावित होते हैं। मेरी jsFiddle पर परीक्षा देखें: jsfiddle.net/shamasis/dG4PH
शमासिस भट्टाचार्य

3
@alex यह नहीं spliceकरता है, सरणी को संशोधित करता है और हटाए गए प्रविष्टियों को वापस करता है। डॉक्स पहले पढ़ें: developer.mozilla.org/en-US/docs/JavaScript/Reference/…
डेविड हेलसिंग

3
हम का उपयोग करके लौटाए जाने से उत्पन्न सरणी रोक सकती अल्पविराम ऑपरेटर : A.splice(0, A.length),0;। यह 0जैसा A.length = 0;होगा वैसा ही एक रिटर्न वैल्यू छोड़ देगा। परिणामी सरणी अभी भी बनाई गई है और स्क्रिप्ट को धीमा चलाने का कारण बनना चाहिए : ( jsperf ~ 56% धीमी)। ब्राउज़र कार्यान्वयन इसे प्रभावित करेगा, हालांकि मुझे कोई कारण नहीं दिखता कि spliceसेटिंग से अधिक तेज़ क्यों होगा length
इवान केनेडी

8
मैंने यह भी पाया है कि सिर्फ A.splice(0)काम भी करता है।
corwin.amber

97

जिन उत्तरों का कोई कम नहीं है, जो अब तक 2739 अपवित्र हैं, वे भ्रामक और गलत हैं।

सवाल यह है: "आप अपने मौजूदा सरणी को कैसे खाली करते हैं?" जैसे के लिए A = [1,2,3,4]

  1. " A = []उत्तर है" कहना अज्ञानी और बिल्कुल गलत है। [] == []है झूठी

    इसका कारण यह है कि ये दो सरणियाँ दो अलग-अलग हैं, अलग-अलग वस्तुएं, अपनी स्वयं की दो पहचानों के साथ, डिजिटल दुनिया में अपना स्थान, प्रत्येक अपने दम पर।


मान लीजिए कि आपकी मां आपसे कचरा खाली करने के लिए कहती है।

  • आप एक नए रूप में नहीं लाते हैं जैसे कि आपने वही किया है जो आपसे मांगा गया है।
  • इसके बजाय, आप कचरा खाली कर सकते हैं।
  • आप भरे हुए को नए खाली डिब्बे से बदल नहीं सकते हैं, और आप भरे हुए कैन से "A" का लेबल नहीं लगाते हैं और इसे नए आकार में चिपका सकते हैं। A = [1,2,3,4]; A = [];

किसी सरणी वस्तु को खाली करना सबसे आसान काम है:

A.length = 0;

इस तरह, "ए" के तहत न केवल खाली है, बल्कि नए रूप में भी साफ है!


  1. इसके अलावा, जब तक कैन खाली न हो, आपको हाथ से कचरा हटाने की आवश्यकता नहीं है! आपको मौजूदा एक को पूरी तरह से खाली करने के लिए कहा गया था, पूरी तरह से, एक मोड़ में, कचरा उठाने के लिए नहीं जब तक कि खाली नहीं हो सकता, जैसे कि:

    while(A.length > 0) {
        A.pop();
    }
  2. न ही, अपने बाएं हाथ को कूड़े के तल पर रखने के लिए, अपनी सामग्री को ऊपर खींचने में सक्षम होने के लिए शीर्ष पर अपने दाहिने हाथ से पकड़ना:

    A.splice(0, A.length);

नहीं, आपको इसे खाली करने के लिए कहा गया था:

A.length = 0;

यह एकमात्र कोड है जो किसी दिए गए जावास्क्रिप्ट सरणी की सामग्री को सही ढंग से खाली करता है।


11
आपके सुझाए गए समाधान के साथ एकमात्र समस्या यह है कि कचरा अभी भी मौजूद है, बस यह है कि आपने नोटिस बोर्ड को यह कहते हुए बदल दिया कि कोई कचरा नहीं है। पुराने सरणी का संदर्भ अभी भी मौजूद होना चाहिए। क्या आप सुनिश्चित कर सकते हैं कि कचरा जमा करते समय .length = 0, सरणी और उसके गुणों के सभी संदर्भों को भी हटा देगा? मुझे लगता है कि यह हालांकि करता है, लेकिन मेरे लिए यह जादू है। कम से कम कहने के लिए भ्रम से बचने के लिए .clear () विधि वांछनीय है।
mmm

8
मैंने कभी नहीं कहा कि यह समाधान गलत है। समस्या यह है कि यह पूरा धागा पूरी तरह से अनावश्यक है। 3000 से अधिक मतों से पता चलता है कि सबसे अच्छा तरीका यह पता लगाने की कोशिश करना चाहिए कि इस तरह की विधि को जोड़ने के लिए EMCA क्रैक हेड डेवलपर्स के लिए यह एक वैध पर्याप्त मामला है। किसी को भी इसका पता नहीं लगाना चाहिए। इसे करने के तीन - चार अलग-अलग तरीके हैं। कुछ बेंचमार्क में, लंबाई समाधान दूसरों की तुलना में बहुत धीमा है। इसके अलावा, सेटिंग का विचार .length = 0, किसी भी उचित डेवलपर के लिए एक संतोषजनक नहीं होगा।
mmm

2
क्योंकि इसे पूरा करने के लिए, सभी संदर्भों को हटा दिया जाना चाहिए। .length = 0 भी एक विधि कॉल नहीं है, इसलिए यदि 0 पर सेट होने पर अन्य कार्य किए जाते हैं (जो कि परिभाषित सेटर के माध्यम से अधिकांश ब्राउज़र में है) तो मैं अभी भी इसे बहुत जादुई मानूंगा कि वास्तव में इस पर भरोसा करना क्या होता है करने के लिए।
एमएम

7
इसलिए, मैं इसे स्वयं स्पष्ट करूँगा। एक स्पष्ट पद्धति को प्रोटोटाइप किया जा सकता है लेकिन यह सिर्फ बदसूरत है। मेरा कहना है कि यह कार्यान्वयन पहले से ही मौजूद होना चाहिए ताकि 10 000 से अधिक डेवलपर्स को केवल इस धागे को पढ़ने में घंटों खर्च न करना पड़े, उन सभी लोगों पर विचार न करें जिन्होंने अधिक समय बेंचमार्किंग पर खर्च किया था।
एमएमएम

1
आपके सरणी को खाली करने का केवल एक ही तरीका है कि इसे नए आने वाले डेटा से भरें और इसे फिर से छोड़ दें। अन्य सभी या तो नहीं हैं, या हास्यास्पद रूप से अक्षम और अक्षम रूप से सीपीयू भूखे हैं। एकमात्र व्यावहारिक विकल्प उस A(n) = A.splice( 0, A.length );स्थिति में है जब आपको अपनी पिछली सामग्री का बैकअप लेना होगा। पीएस Array.lengthएक पढ़ा-लिखा संपत्ति \ विधि है, अगर आपने उस मूल तथ्य को याद नहीं किया है। मतलब, आप इसे एक नई लंबाई तक विस्तारित कर सकते हैं, आप इसे अपनी इच्छित लंबाई के हिसाब से ट्रिम कर सकते हैं, और दूसरों के बीच आप इसकी लंबाई को छोटा करके सभी सदस्यों को त्याग सकते हैं। यह सरणी का स्विस-चाकू है।
बेकिम बाकाज

63

प्रदर्शन का परीक्षण:

http://jsperf.com/array-clear-methods/3

a = []; // 37% slower
a.length = 0; // 89% slower
a.splice(0, a.length)  // 97% slower
while (a.length > 0) {
    a.pop();
} // Fastest

9
आपके प्लेटफ़ॉर्म पर ध्यान दिए बिना प्रतिशत परिवर्तन को जोड़ने से बहुत अधिक उपयोग होता है। मेरी मशीन पॉप में क्रोम 34 में केवल बहुत ही हल्का है, लेकिन नवीनतम फ़ायरफ़ॉक्स में वास्तव में धीमा है।
मैट स्टाइल्स

2
Windows NT 6.3 64-बिट, a = [] पर फ़ायरफ़ॉक्स 39.0 32-बिट में परीक्षण सबसे तेज़ है!
रेजा-एस 4

5
क्रोम के तहत इस परीक्षा परिणाम में निश्चित रूप से कुछ गड़बड़ है। कैसे नरक में पॉपिंग लूप इतना तेज हो सकता है फिर अन्य 3 समाधान?
चकरली ३०'१६ को ०:४

9
@chqrlie यह नहीं है। यह सबसे धीमी विधि है। बेंचमार्क टेस्ट त्रुटिपूर्ण है।
फिलिप लेबेर्ट

15
कृपया इस उत्तर को हटा दें क्योंकि यह गलत है, और नकली सबूत के रूप में अर्थहीन त्रुटिपूर्ण परीक्षण के लिए लिंक।
जेम्स वेकफील्ड

35

आप इसे अपनी जावास्क्रिप्ट फ़ाइल में जोड़ सकते हैं ताकि आपके सरणियों को "साफ़" किया जा सके:

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

तो आप इसे इस तरह से उपयोग कर सकते हैं:

var list = [1, 2, 3];
list.clear();

या यदि आप सुनिश्चित करना चाहते हैं कि आप कुछ नष्ट न करें:

if (!Array.prototype.clear) {
    Array.prototype.clear = function() {
       this.splice(0, this.length);
    };
}

बहुत से लोग सोचते हैं कि आपको देशी वस्तुओं (जैसे ऐरे) को संशोधित नहीं करना चाहिए, और मैं सहमत होने के लिए इच्छुक हूं। कृपया यह तय करने में सावधानी बरतें कि इसे कैसे संभालना है।


1
@naomik क्या आप अपने तर्क के बारे में बता सकते हैं कि ऐसा क्यों किया जाता है?
पूर्वनिर्धारित

17
यह "ऐरे और स्ट्रिंग" जैसे जावास्क्रिप्ट आदिम कार्यों को संशोधित करने के लिए "पर आधारित" है। आप संभवतः पहले से मौजूद फ़ंक्शन को ओवरलोड कर सकते हैं और ऑब्जेक्ट क्लास को कचरा कर सकते हैं। एक अस्पष्ट जावास्क्रिप्ट इंजन हो सकता है जो पहले से ही स्पष्ट है () और उम्मीद करता है कि यह एक अलग तरह का व्यवहार करेगा। ध्यान से बोलो सब मैं कह रहा हूँ।
एड्रियन

उस समस्या के बारे में कैसे जहां एक सरणी के सदस्यों पर एक फॉर्च्यूनर करना अचानक एक clearकुंजी सहित शुरू होगा ?
एरिक


19

कुछ समय के बारे में बहुत भ्रम और गलत सूचना है, उत्तर और टिप्पणियों दोनों में पॉप / शिफ्ट प्रदर्शन। जबकि / पॉप समाधान में सबसे खराब प्रदर्शन होता है । वास्तव में क्या हो रहा है कि सेटअप केवल एक बार प्रत्येक नमूने के लिए चलता है जो स्निपेट को लूप में चलाता है। उदाहरण के लिए:

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सरणी को साफ़ करने का सबसे तेज़ तरीका है (ध्यान []में नहीं लेने के कारण, जबकि यह सबसे तेज़ है, यह वास्तव में मौजूदा सरणी को साफ़ नहीं कर रहा है)।


बहुत अच्छी बात! मैं सही बेंचमार्क परिणामों के साथ मूल उत्तर को अपडेट करूंगा।
फिलिप लेबेर्ट

मैं विश्वास नहीं कर सकता कि किसी ने भी उस बेंचमार्क त्रुटि को देखा। आधे मिलियन से अधिक विचारों के साथ आप किसी से यह नोटिस करने की उम्मीद करेंगे। महान काम डायडिस्टिस
फिलिप लेबेर्ट

15

यदि आप मेमोरी आवंटन में रुचि रखते हैं, तो आप क्रोम देव टूल्स के टाइमलाइन टैब के संयोजन में इस jsfiddle जैसी किसी चीज का उपयोग करके प्रत्येक दृष्टिकोण की तुलना कर सकते हैं । आप 'क्लियरिंग' एरे के बाद कचरा संग्रह को बाध्य करने के लिए नीचे कूड़ेदान के चिह्न का उपयोग करना चाहेंगे। यह आपको अपनी पसंद के ब्राउज़र के लिए अधिक निश्चित उत्तर देना चाहिए। यहाँ बहुत सारे उत्तर पुराने हैं और मैं उन पर भरोसा नहीं करता, बल्कि @ tanguy_k के उत्तर के रूप में परीक्षण करता हूँ।

(पूर्वोक्त टैब पर एक परिचय के लिए आप यहां देख सकते हैं )

Stackoverflow मुझे 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>

और आपको ध्यान रखना चाहिए कि यह सरणी तत्वों के प्रकार पर निर्भर हो सकता है, क्योंकि जावास्क्रिप्ट अन्य वस्तुओं की तुलना में अन्य आदिम प्रकारों की तुलना में अलग-अलग तार का प्रबंधन करता है। प्रकार प्रभावित हो सकता है कि क्या होता है।


15

आप आसानी से ऐसा करने के लिए एक फ़ंक्शन बना सकते हैं, लंबाई बदल सकते हैं या फिर इसे पुनः उपयोग के लिए फ़ंक्शन के रूप में मूल सरणी में जोड़ सकते हैं 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); //[]

इसलिए यदि गिरफ्तारी में 5 आइटम हैं, तो यह 0 से 5 आइटम को विभाजित करेगा, जिसका मतलब है कि कुछ भी नहीं रहेगा।

इसके अलावा अन्य तरीके जैसे उदाहरण के लिए सरणी को पुन: असाइन करें:

arr = []; //[]

यदि आप ऐरे फ़ंक्शंस को देखते हैं, तो ऐसा करने के कई अन्य तरीके हैं, लेकिन सबसे अधिक अनुशंसित एक की लंबाई बदल सकती है।

जैसा कि मैंने पहली बार कहा था, आप इसे हटा सकते हैं () क्योंकि यह आपके प्रश्न का उत्तर है। आप बस ऊपर दिए गए तरीकों में से किसी एक को चुन सकते हैं और इसे जावास्क्रिप्ट में ऐरे ऑब्जेक्ट पर प्रोटोटाइप कर सकते हैं, जैसे कुछ:

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

और आप इसे इस तरह से अपने जावास्क्रिप्ट एप्लिकेशन में किसी भी सरणी को खाली करने के लिए कह सकते हैं:

arr.remove(); //[]

arr.length = 0; // लंबाई बदलें
अजय मल्होत्रा

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

और इसे कॉल करें: array.clear();


77
कृपया देशी वस्तुओं के संशोधन को प्रोत्साहित न करें।
शुक्रिया

21
लोगों के पास स्वीकार किए गए उत्तर को हथियाने और इसे एक प्रोटोटाइप फ़ंक्शन में डालने की प्रवृत्ति क्यों है? क्या आप वास्तव में अपनी परियोजनाओं में ऐसा करते हैं? क्या आपके पास प्रोटोटाइप जोड़ की एक विशाल लाइब्रेरी है जिसे आप हर प्रोजेक्ट में शामिल करते हैं?
nurettin

4
सिर्फ अरेंज टाइप क्यों नहीं किया जाता है।
एड्रियन

10
@naomik "कृपया देशी वस्तुओं के संशोधन को प्रोत्साहित न करें।" - मैं इस बात से पूरी तरह सहमत हूं, लेकिन सिर्फ वाक्य को दोहराने से घमंडी बन जाता है। इस तरह के समाधान का प्रस्ताव रखने वाले किसी व्यक्ति को परिणामों के बारे में पता नहीं होता है, और एक छोटी व्याख्या या लिंक प्रदान करने के बजाय उन पर इस लाइन को छोड़ने का अर्थ यह नहीं है कि "हम के अलावा, लोग आपसे ज्यादा होशियार हैं, आपको बताएं कि ऐसा न करें," क्योंकि हम बेहतर जानते हैं ”
जॉन वीज़


12

A.splice(0);

मैंने अभी कुछ कोड पर काम किया है जिस पर मैं काम कर रहा हूं। इससे व्यूह साफ हो गया।


नहीं, आपने अभी-अभी नामांकित कंटेनर को एक नए बनाए गए अनाम के साथ स्वैप किया है। `वर ए = [1,2,3,4]; var बी; बी = ए। सल्पिस (0); console.log (ए); console.log (बी); '
बेकिम बकाज

12

यदि आप उपयोग कर रहे हैं

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 द्वारा पिछले उत्तर के अनुसार, दूसरा तरीका तेज़ है।


10
पर गलत होने के अलावा a.length, मैं यह नहीं देखता कि यह नया उत्तर धागे में क्या जोड़ता है?
बरगी

@ बर्गी मैं केवल सरणी के बारे में वास्तविक स्मृति प्रतिनिधित्व पर ध्यान केंद्रित करना चाहता हूं
लक्ष्मीकांत डांगे

क्या आपके पास यह पुष्टि करने के लिए कोई स्रोत है कि कौन सा JS इंजन एक नया सरणी बनाएगा a.length=0;? उन इंजनों के लिए कार्य a.length=500;और कैसे होगा a.length=4;?
joeytwiddle

मैंने इसे अधिकांश ब्राउज़रों पर आज़माया, जैसे IE, फ़ायरफ़ॉक्स, क्रोम, यह नई सरणी बना रहा है। यदि आप 0 से अधिक की लंबाई निर्धारित करते हैं तो यह अपरिभाषित तत्वों के साथ एक सरणी बनाएगा, अर्थात यह बस कुछ मेमोरी लोकेशन रखेगा।
लक्ष्मीकांत डांगे

1
var a = [1]; var b = a; a.length = 0; console.log(b)प्रिंट Array [ ]करता है, इसलिए ऐसा नहीं लगता कि यह मेरे लिए एक नई सरणी बना रहा है।
जॉन मोंटगोमरी

9

जन प्रारंभिक सुझाव के संशोधित संस्करण का उपयोग करें :

var originalLength = A.length;
for (var i = originalLength; i > 0; i--) {
     A.pop();
}

12
आप ऐसा काम क्यों करना चाहेंगे? एक ही काम करने के लिए दो और चर और कोड का एक गुच्छा क्यों जोड़ें?
किल्लाह

6

यदि आप स्थिरांक का उपयोग करते हैं तो आपके पास कोई विकल्प नहीं है:

const numbers = [1, 2, 3]

आप पुन: असाइन नहीं कर सकते:

numbers = []

आप केवल काट सकते हैं:

numbers.length = 0

5

यहां छवि विवरण दर्ज करें

किसी सरणी उपयोग के वर्तमान मेमोरी स्थान को खाली करने के लिए: 'myArray.length = 0'या'myArray.pop() UN-till its length is 0'

  • length: आप किसी भी समय किसी सरणी को छोटा करने के लिए लंबाई गुण सेट कर सकते हैं। जब आप किसी सरणी को उसकी लंबाई गुण बदलकर विस्तारित करते हैं, तो वास्तविक तत्वों की संख्या बढ़ जाती है।
  • pop() : पॉप विधि अंतिम तत्व को एक सरणी से निकालती है और हटाए गए मान को वापस लौटाती है।
  • shift(): शिफ्ट विधि शून्य शून्य सूचकांक में तत्व को हटाती है और मूल्यों को लगातार अनुक्रमित नीचे स्थानांतरित करती है , फिर हटाए गए मान को वापस करती है।

उदाहरण:

var arr = ['77'];
arr.length = 20;
console.log("Increasing : ", arr); // (20) ["77", empty × 19]
arr.length = 12;
console.log("Truncating : ", arr); // (12) ["77", empty × 11]

var mainArr = new Array();
mainArr = ['1', '2', '3', '4'];

var refArr = mainArr;
console.log('Current', mainArr, 'Refered', refArr);

refArr.length = 3;
console.log('Length: ~ Current', mainArr, 'Refered', refArr);

mainArr.push('0');
console.log('Push to the End of Current Array Memory Location \n~ Current', mainArr, 'Refered', refArr);

mainArr.poptill_length(0);
console.log('Empty Array \n~ Current', mainArr, 'Refered', refArr);

Array.prototype.poptill_length = function (e) {
  while (this.length) {
    if( this.length == e ) break;

    console.log('removed last element:', this.pop());
  }
};

  • new Array() | [] का उपयोग करके Array constructorया नए स्मृति स्थान के साथ एक सरणी बनाएँ array literal

    mainArr = []; // a new empty array is addressed to mainArr.
    
    var arr = new Array('10'); // Array constructor
    arr.unshift('1'); // add to the front
    arr.push('15'); // add to the end
    console.log("After Adding : ", arr); // ["1", "10", "15"]
    
    arr.pop(); // remove from the end
    arr.shift(); // remove from the front
    console.log("After Removing : ", arr); // ["10"]
    
    var arrLit = ['14', '17'];
    console.log("array literal « ", indexedItem( arrLit ) ); // {0,14}{1,17}
    
    function indexedItem( arr ) {
        var indexedStr = "";
        arr.forEach(function(item, index, array) {
            indexedStr += "{"+index+","+item+"}";
            console.log(item, index);
        });
        return indexedStr;
    }
  • slice() : स्लाइस फ़ंक्शन का उपयोग करके हम नए मेमोरी एड्रेस के साथ मूल सरणी से तत्वों की एक उथली प्रतिलिपि प्राप्त करते हैं, ताकि क्लोन पर कोई भी संशोधन वास्तविक वास्तविक प्रभाव को प्रभावित न करे।

    var shallowCopy = mainArr.slice(); // this is how to make a copy
    
    var cloneArr = mainArr.slice(0, 3); 
    console.log('Main', mainArr, '\tCloned', cloneArr);
    
    cloneArr.length = 0; // Clears current memory location of an array.
    console.log('Main', mainArr, '\tCloned', cloneArr);

"लंबाई: एक सरणी की लंबाई तक चबूतरे का आकार निर्दिष्ट होता है।" आपको यह बकवास किसने कहा?
बेकिम बाकज

@BekimBacaj संक्षेप में, यह एक ही प्रभाव करता है। इसे शायद सिर्फ कहने के length = ?बजाय कहना चाहिए था length
टुपर्टुनुत

@BekimBacaj मैंने अपना उत्तर अपडेट कर दिया है, मैंने केवल उस लंबाई को लंबाई तक पॉप माना है, लेकिन मैंने अब सही किया है कि लंबाई केवल एक सरणी के आकार को छोटा करती है या बढ़ाती है।
यश

3

मुझे आश्चर्य है कि किसी ने भी अभी तक इसका सुझाव नहीं दिया है:

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)


7
यह एक अलग सवाल का एक अच्छा जवाब हो सकता है: "किसी तत्व को अपरिभाषित तत्वों में कैसे परिवर्तित किया जाए"।
रुबेन

हालांकि आंतरिक रूप से अपरिभाषित तत्वों और खाली स्लॉट्स ("छेद") के बीच अंतर होता है
Cauterite

-9

यदि आपको कोणीय 2+ फॉर्मअरे को खाली करने की आवश्यकता है तो नीचे का उपयोग करें।

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

10
यह अप्रासंगिक है और जावास्क्रिप्ट भी नहीं।
एमिल बर्जरॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.