আমি কীভাবে জাভাস্ক্রিপ্টে একটি অ্যারে খালি করব?


2197

অ্যারে খালি করার কোনও উপায় আছে এবং যদি সম্ভবত এটি দিয়ে থাকে .remove()?

এই ক্ষেত্রে,

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

আমি কীভাবে এটি খালি করতে পারি?


1
এখানে বিভিন্ন সম্ভাবনার একটি মাপদণ্ড রয়েছে: jsben.ch/#/7QyI1
এস্কেপনেটস্কেপ

উত্তর:


4411

একটি বিদ্যমান অ্যারে সাফ করার উপায় 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 (যেমন প্রস্তাব দ্বারা ম্যাথু Crumley )

A.length = 0

এটি 0-এর দৈর্ঘ্য নির্ধারণ করে বিদ্যমান অ্যারেটিকে সাফ করবে Some কিছু লোক যুক্তি দেখিয়েছেন যে এটি জাভাস্ক্রিপ্টের সমস্ত বাস্তবায়নে কাজ করতে পারে না, তবে দেখা যাচ্ছে যে এটি এমন নয়। এটি ECMAScript 5 এ "কঠোর মোড" ব্যবহার করার সময়ও কাজ করে কারণ একটি অ্যারের দৈর্ঘ্যের সম্পত্তিটি পড়ার / লেখার সম্পত্তি।

পদ্ধতি 3 ( অ্যান্টনির পরামর্শ অনুসারে )

A.splice(0,A.length)

ব্যবহার .splice()নিখুঁতভাবে কাজ করবে, তবে যেহেতু .splice()ফাংশনটি সমস্ত মুছে ফেলা আইটেমগুলির সাথে একটি অ্যারে প্রদান করবে, এটি আসলে আসল অ্যারের একটি অনুলিপি ফিরে আসবে। বেঞ্চমার্কগুলি প্রস্তাব দেয় যে এটির যাবতীয় কার্যকারিতার উপর কোনও প্রভাব নেই।

পদ্ধতি 4 ( টাঙ্গুয়_ কে পরামর্শ দেওয়া হয়েছে )

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

এই সমাধানটি খুব সংক্ষিপ্ত নয়, এবং এটি মূলতম উত্তরে উল্লেখ করা পূর্ববর্তী মানদণ্ডগুলির বিপরীতেও সবচেয়ে ধীর সমাধান solution

কর্মক্ষমতা

বিদ্যমান অ্যারে সাফ করার সমস্ত পদ্ধতির মধ্যে , পদ্ধতি 2 এবং 3 পারফরম্যান্সের ক্ষেত্রে খুব একই রকম এবং 4 পদ্ধতির চেয়ে অনেক দ্রুত । এই মানদণ্ডটি দেখুন ।

নীচে তাদের উত্তরে ডায়াডিসটিস দ্বারা চিহ্নিত হিসাবে , উপরে বর্ণিত চারটি পদ্ধতির কার্যকারিতা নির্ধারণ করতে ব্যবহৃত মূল মানদণ্ডগুলি ত্রুটিযুক্ত ছিল। আসল বেঞ্চমার্ক ক্লিয়ার করা অ্যারেটিকে পুনরায় ব্যবহার করেছে যাতে দ্বিতীয় পুনরাবৃত্তি ইতিমধ্যে খালি একটি অ্যারে সাফ করছিল।

নিম্নলিখিত মানদণ্ড এই ত্রুটিগুলি সমাধান করে: http://jsben.ch/#/hyj65 । এটি পরিষ্কারভাবে দেখায় যে পদ্ধতি # 2 (দৈর্ঘ্যের সম্পত্তি) এবং # 3 (বিভাজন) দ্রুততম (গণনা পদ্ধতি # 1 যা আসল অ্যারে পরিবর্তন করে না)।


এটি একটি আলোচিত বিষয় এবং প্রচুর বিতর্কের কারণ হয়ে দাঁড়িয়েছে। আসলে অনেকগুলি সঠিক উত্তর রয়েছে এবং যেহেতু এই উত্তরটি দীর্ঘ সময়ের জন্য গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত হয়েছে, আমি এখানে সমস্ত পদ্ধতি অন্তর্ভুক্ত করব। আপনি যদি এই উত্তরের পক্ষে ভোট দেন, দয়া করে অন্যান্য উত্তরগুলিও উত্তর দিন যা আমি উল্লেখ করেছি।


183
while (A.length) { A.pop(); }, কোনও প্রয়োজন নেই> 0
ইভান ব্ল্যাক

327
> 0আরও পাঠযোগ্য আইএমএইচও। এবং দুজনের মধ্যে পারফরম্যান্সের কোনও পার্থক্য নেই।
ফিলিপ লেবার্ট

10
@ ডাঘান, আপনি কী বলার চেষ্টা করছেন তা মোটেই পরিষ্কার নয়। একটি নতুন নির্ধারিত bহওয়ার পরেও পুরানো অ্যারেতে একটি রেফারেন্স রয়েছে acএবং dএকই অ্যারে রেফারেন্স অবিরত। আউটপুটগুলির মধ্যে পার্থক্য তাই প্রত্যাশিত।
shovavnik

9
@ ডিগোজ্যানিক পদ্ধতি # 1 গণনা করছে না কারণ এটি অ্যারে সাফ করে না। এটি একটি নতুন তৈরি করে। এটিকে কোনও মানদণ্ডে অন্তর্ভুক্ত করা উচিত নয়।
ফিলিপ লেবার্ট

44
while(A.pop())অ্যারেতে কোনও আইটেম মিথ্যা হলে আপনি ব্যবহার করতে পারবেন না । উদাহরণস্বরূপ এ = [2, 1, 0, -1, -2] ধরুন A এর সমান হবে [2, 1]। এমনকি while(A.pop() !== undefined)কাজ করে না কারণ আপনার মানগুলির মধ্যে একটি হিসাবে অপরিজ্ঞাতকৃত একটি অ্যারে থাকতে পারে। সম্ভবত সংকলক কেন এটি অনুকূলিত করে না।
জোনাথন গাওরিচ

2458

আপনার যদি মূল অ্যারেটি রাখা প্রয়োজন কারণ আপনার অন্যান্য উল্লেখ রয়েছে যা এটিও আপডেট হওয়া উচিত, আপনি এর দৈর্ঘ্য শূন্যে সেট করে একটি নতুন অ্যারে তৈরি না করে এটিকে সাফ করতে পারেন:

A.length = 0;

17
ECMAScript 5 স্ট্যান্ডার্ড এ সম্পর্কে কী বলে?
পেসারিয়ার

212
@ পেসারিয়র: এটি এখনও ইএস 5 এ কাজ করে। বিভাগের 15.4 থেকে: "... যখনই দৈর্ঘ্যের সম্পত্তি পরিবর্তন করা হয়, প্রতিটি সম্পত্তি যার নাম একটি অ্যারে সূচক যার মান নতুন দৈর্ঘ্যের চেয়ে ছোট নয় স্বয়ংক্রিয়ভাবে মুছে ফেলা হয়"
ম্যাথু ক্রামলে

2
@ আইনার: জাভাস্ক্রিপ্ট অ্যারেগুলি আপনি যা কিছু রাখবেন তা ফিট করার জন্য সর্বদা প্রসারিত হয়, তাই আপনি যখন কল করবেন তখন myarray.push(whatever)এটি দৈর্ঘ্যে একটি যোগ করে। সুতরাং দৈর্ঘ্য নির্ধারণ করে অ্যারে ছাঁটাই, তবে এটি স্থায়ী নয়।
ম্যাথু ক্রামলে

12
@ লসমনোস এমনকি কঠোর মোডেও lengthএকটি বিশেষ সম্পত্তি, তবে কেবল এটিই পড়ে না, তাই এটি এখনও কার্যকর হবে।
ম্যাথু ক্রামলে

11
@ ম্যাটিউ ক্রামলে আমি কিছু পরীক্ষা করেছি এবং দেখে মনে হচ্ছে aleleth = 0 পুরো অ্যারে দক্ষ সাফ করার জন্য নয়। jsperf.com/length-equal-0-or- নতুন- অ্যারে আমি মনে করি আপনার যদি একটি রিফ্রেন্স থাকে (এবং আপনি যে অতিরিক্ত সম্পত্তি রাখতে চান যা আপনি যোগ করেন নি), নতুন অ্যারে তৈরি করা ভাল, এবং পুরানোতে রেখে দিন আবর্জনা সংগ্রহকারী, এটি যখন উপযুক্ত হবে তখন চলবে।
পল ব্রিউকজেনস্কি

289

একই অ্যারে রাখার সময় এখানে দ্রুততম কার্যকর বাস্তবায়ন ("পরিবর্তনযোগ্য"):

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

FYI এটিকে সরল করা যায় না while (array.pop()): পরীক্ষাগুলি ব্যর্থ হবে।

এফওয়াইআই মানচিত্র এবং সেট সংজ্ঞায়িত করা হয়েছে clear(), অ্যারের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);
  });
});

এখানে আপডেট করা জেএসফুল: http://jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152


5
টিটি আপনার উত্তরটি কেবলমাত্র সঠিক এবং দ্রুত (একই সাথে) তবে এর চেয়ে অনেক কম "আপভোটস" রয়েছে। ঠিক আছে, দেখে মনে হচ্ছে যে লোকেদের
মনোরম

@ ননমিক তবে এটি একটি প্রাথমিক কার্যকারিতা যা ডিফল্টরূপে সেখানে হওয়া উচিত ছিল।
thefourtheye

7
@ থেফোর্তেয়ে পারফরম্যান্সের জন্য ভাল সমাধান, যদিও আমি @ নোমিকের সাথে একমত, আপনার নেটিভ অবজেক্টগুলি পরিবর্তন করা উচিত নয়। বলার অপেক্ষা রাখে না যে পয়েন্টটির পাশে এটি থাকা উচিত, সমস্যাটি হ'ল আপনি গ্লোবালগুলি সংশোধন করছেন যা খারাপ। যদি আপনি অন্যদের ব্যবহারের জন্য আপনার কোড সরবরাহ করে থাকেন তবে তার কোনও অপ্রত্যাশিত পার্শ্ব প্রতিক্রিয়া হওয়া উচিত নয়। কল্পনা করুন যে অন্য লাইব্রেরিও যদি এই সংশোধন করে Array.prototypeএবং এটি কিছুটা পৃথকভাবে কাজ করে, তবে আপনার সমস্ত কোডটি [].clear()কিছুটা ভুল ছিল। এটি ডিবাগ করতে মজা হবে না। সুতরাং, সাধারণ বার্তাটি হ'ল: গ্লোবালগুলি সংশোধন করবেন না।
jpillora

3
@ থেফোর্তেয়ে বৈশ্বিক সুযোগ পরিবর্তন না করার পুরো বিষয়টি হ'ল কারণ আপনি জানেন না যে অন্য কারও কোড ইতিমধ্যে নামটি ব্যবহার করছে (বা হবে)। আমি স্থানীয় ক্ষেত্রের মধ্যে একটি ফাংশন প্রস্তাব। সুতরাং, আপনার অ্যাপ্লিকেশান / লাইব্রেরির ভিতরে IIFE , কি function clear(arr) { while(arr.length) arr.pop(); }, তারপর স্পষ্ট অ্যারে সঙ্গে clear(arr)পরিবর্তে arr.clear()
jpillora

2
এটি সক্রিয় আউট এই পদ্ধতি তুলনায় অনেক ধীর .splice()এবং .length=0। মানদণ্ডগুলি সঠিক ছিল না। আমার আপডেট হওয়া উত্তরটি দেখুন।
ফিলিপ লেবার্ট

216

spliceনীচে হিসাবে অ্যারের ক বিষয়বস্তু খালি করতে পদ্ধতিটি ব্যবহার করা আরও ক্রস ব্রাউজার বান্ধব এবং আরও অনুকূল সমাধান হতে পারে :

A.splice(0, A.length);


48
কেন এই আরও ক্রস ব্রাউজার বন্ধুত্বপূর্ণ? এ.এলেন্থ নিয়ে কোন ব্রাউজারগুলির সমস্যা আছে?
stricjux

4
@ জেএম 2 আপনি যা বলছেন তা সম্পূর্ণ সত্য নয়। এটি আসলে প্রশ্নে অ্যারেটি সংশোধন করে এবং পরবর্তীকালে সমস্ত উল্লেখগুলি প্রভাবিত হয়। আমার জেএসফিডালে পরীক্ষাটি দেখুন: jsfiddle.net/shamasis/dG4PH
শামাসিস ভট্টাচার্য

3
@ অ্যালেক্স না এটি করে না, spliceঅ্যারে সংশোধন করে এবং মোছা এন্ট্রিগুলি ফেরত দেয়। প্রথমে
ডক্সটি

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 = [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
আপনার প্রস্তাবিত সমাধানের একমাত্র সমস্যাটি হ'ল আবর্জনা এখনও বিদ্যমান, আপনি নোটিশ বোর্ড পরিবর্তন করে বলেছিলেন যে কোনও ট্র্যাশ নেই। পুরানো অ্যারে সম্পর্কিত একটি রেফারেন্স এখনও থাকা উচিত। আপনি কি নিশ্চিত হতে পারেন যে দৈর্ঘ্য = 0 সেট করার সময় আবর্জনা সংগ্রহকারী অ্যারে এবং এর বৈশিষ্ট্যগুলির সমস্ত রেফারেন্সও সরিয়ে ফেলবে? আমি মনে করি এটি যদিও করে তবে আমার কাছে এটি যাদু। একটি। ক্লিয়ার () পদ্ধতিটি কমপক্ষে বলতে গেলে বিভ্রান্তি এড়াতে বাঞ্ছনীয়।
মিমি

8
আমি কখনও বলিনি যে এই সমাধানটি ভুল। সমস্যাটি হ'ল এই পুরো থ্রেডটি সম্পূর্ণ আনসেসারি। 3000 এরও বেশি ভোট দেখায় যে সর্বোত্তম উপায়টি কী তা নির্ধারণের চেষ্টা করা উচিত যাতে EMCA ক্র্যাক হেড বিকাশকারীদের এ জাতীয় পদ্ধতি যুক্ত করার পক্ষে এটি একটি বৈধ যথেষ্ট ক্ষেত্রে তৈরি করা উচিত। কারও পক্ষে এটি বের করার দরকার নেই। এটি করার জন্য তিন - চারটি বিভিন্ন উপায় রয়েছে। কিছু মানদণ্ডে, দৈর্ঘ্যের সমাধানগুলি অন্যদের তুলনায় অনেক ধীর। তদ্ব্যতীত, কোনও যুক্তিসঙ্গত বিকাশকারীকে জন্য .leth = 0 নির্ধারণের ধারণাটি সন্তোষজনক নয়।
মিমি

2
এটি যা করা উচিত তা সম্পাদন করার জন্য, সমস্ত উল্লেখগুলি অবশ্যই মুছে ফেলা উচিত। । দৈর্ঘ্য = 0 এমনকি একটি পদ্ধতি কলও নয়, সুতরাং এটি 0 তে সেট করার পরে যদি অন্যান্য পদক্ষেপ নেওয়া হয় (যা সংজ্ঞায়িত সেটারের মাধ্যমে বেশিরভাগ ব্রাউজারে রয়েছে) আমি এখনও এটি বিশ্বাস করি এটি খুব যাদু হিসাবে বিবেচনা করব যা এটি মনে করে যা করে করতে.
মিমি

7
অতএব, আমি বরং এটি নিজেই সাফ করব। একটি পরিষ্কার পদ্ধতি প্রোটোটাইপ করা যেতে পারে তবে এটি কেবল কুৎসিত। আমার বক্তব্যটি হ'ল এই বাস্তবায়নটি ইতিমধ্যে উপস্থিত থাকা উচিত যাতে 10,000 এর বেশি বিকাশকারীকে কেবল এই থ্রেডটি পড়তে ঘন্টা ব্যয় করতে হবে না, যারা আরও বেশি সময় বেঞ্চমার্কিংয়ে ব্যয় করেছেন তাদের সমস্ত বিবেচনা না করে।
মিমি

1
আপনার অ্যারে খালি করার একমাত্র উপায় রয়েছে এটি নতুন আগত ডেটা দিয়ে পূরণ করুন এবং এটি আবার ফেলে দিন। অন্য সমস্ত হয় হয় না, বা হাস্যকরভাবে অদক্ষ এবং অভাবযুক্ত সিপিইউ ক্ষুধার্ত। A(n) = A.splice( 0, A.length );আপনার পূর্ববর্তী বিষয়বস্তুটিকে ব্যাকআপ করার ক্ষেত্রে একমাত্র ব্যবহারিক বিকল্প । Array.lengthআপনি যদি সেই মৌলিক ঘটনাটি মিস করেন তবে PS একটি পঠন-লিখন সম্পত্তি property পদ্ধতি। অর্থ, আপনি এটিকে একটি নতুন দৈর্ঘ্যে প্রসারিত করতে পারবেন, আপনি যে দৈর্ঘ্যটি চান তা ছাঁটাতে পারবেন না এবং অন্যদের মধ্যে আপনি এর সদস্যদের দৈর্ঘ্য ৪. কমিয়ে দিয়ে সমস্ত সদস্যকে বাতিল করতে পারেন এটি অ্যারের একটি সুইস-ছুরি।
বেকিম বাকাজ

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
উইন্ডোজ এনটি 6.3 64-বিটে ফায়ারফক্স 39.0 32-বিটে পরীক্ষা করা, এ = [] দ্রুততম!
রেজা-এস 4

5
Chrome এর অধীনে এই পরীক্ষার ফলাফলে অবশ্যই স্পষ্ট কিছু আছে। অন্য 3 সমাধানের পরে কীভাবে পপিং লুপটি এত দ্রুত হতে পারে?
chqrlie

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
@ কোনামিক আপনি কি আপনার যুক্তিটি ব্যাখ্যা করতে পারেন যে কেন এমন কাজকে ঘৃণা করা হয়?
অবর্ণিত

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অ্যারেটি সাফ করার দ্রুততম উপায় ( []বিবেচনায় নেই কারণ এটি দ্রুততম হলেও এটি আসলে বিদ্যমান অ্যারেটি সাফ করছে না)।


খুব ভাল পয়েন্ট! আমি আসল উত্তরটি সঠিক বেঞ্চমার্ক ফলাফলের সাথে আপডেট করব।
ফিলিপ লেবার্ট

আমি বিশ্বাস করতে পারি না যে কেউ সেই মানদণ্ডের ত্রুটিটি চিহ্নিত করে নি। অর্ধ মিলিয়নেরও বেশি ভিউ সহ আপনি আশা করবেন যে কেউ এটির নজরে আসবে would দুর্দান্ত কাজ ডায়াডিসটিস
ফিলিপ লেবার্ট

15

আপনি যদি মেমরি বরাদ্দে আগ্রহী হন, আপনি ক্রোম দেব সরঞ্জামগুলির টাইমলাইন ট্যাবের সাথে এই জেফফিডেলের মতো কিছু ব্যবহার করে প্রতিটি পদ্ধতির তুলনা করতে পারেন । অ্যারে ক্লিয়ারিংয়ের পরে আবর্জনা সংগ্রহের জন্য জোর করে নীচে ট্র্যাশ বিন আইকনটি ব্যবহার করতে চাইবেন। এটি আপনাকে আপনার পছন্দসই ব্রাউজারের জন্য আরও সুনির্দিষ্ট উত্তর দিতে হবে। এখানে প্রচুর উত্তর পুরানো এবং আমি তাদের উপর নির্ভর করব না বরং উপরের @ টাঙ্গুয়_ক এর উত্তর হিসাবে পরীক্ষা করবো।

(পূর্বোক্ত ট্যাবে পরিচিতির জন্য আপনি এখানে পরীক্ষা করে দেখতে পারেন )

স্ট্যাকওভারফ্লো আমাকে জেসফিডালটি অনুলিপি করতে বাধ্য করে তাই এটি এখানে:

<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(); //[]

arrleleth = 0; // দৈর্ঘ্য পরিবর্তন করুন
অজয় মালহোত্রা

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

এবং এটি কল: array.clear();


77
অনুগ্রহ করে নেটিভ অবজেক্টগুলির সংশোধনকে উত্সাহিত করবেন না।
আপনাকে ধন্যবাদ

21
লোকেরা কেন গ্রহণযোগ্য উত্তরটি ধরতে এবং এটিকে একটি প্রোটোটাইপ ফাংশনে রাখার প্রবণতা রাখে? আপনি কি আসলে আপনার প্রকল্পগুলিতে এটি করেন? আপনার প্রতিটি প্রকল্পে অন্তর্ভুক্ত প্রোটোটাইপ সংযোজনগুলির একটি বিশাল গ্রন্থাগার রয়েছে?
নুরেটিন

4
কেন শুধু অ্যারে.লেন্থ = 0 টাইপ করবেন না?
এড্রিয়ান

10
@naomik "দয়া করে দেশীয় বস্তুগুলির পরিবর্তনকে উত্সাহিত করবেন না" " - আমি এটির সাথে পুরোপুরি একমত, কিন্তু কেবল বাক্যটি নিজেই পুনরাবৃত্তি করা অহংকারী হিসাবে আসে। কেউ এই জাতীয় সমাধানের প্রস্তাব দিলে তারা পরিণতি সম্পর্কে অবগত হতে পারে না এবং একটি সংক্ষিপ্ত ব্যাখ্যা বা একটি লিঙ্ক সরবরাহ করার পরিবর্তে তাদের উপর এই লাইনটি ফেলে দেওয়া "আমরা, আপনার চেয়ে আরও চৌকস লোকেরা, এটি না করার জন্য আপনাকে বলে," কারণ আমরা আরও ভাল জানি "
জন ওয়েইজ


12

A.splice(0);

আমি যে কোডটি নিয়ে কাজ করছি তা সবেমাত্র এটি করেছি। এটি অ্যারে সাফ করেছে।


না আপনি সদ্য সৃজিত একটি বেনামে নামমাত্র অ্যারে ধারকটি সরিয়ে নিয়েছেন। `var এ = [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, আমি দেখতে পাচ্ছি না এই নতুন উত্তরটি থ্রেডে কী যুক্ত করে?
বার্গি

@ বেরগী আমি ঠিক অ্যারে সম্পর্কে প্রকৃত মেমরির উপস্থাপনা সম্পর্কে ফোকাস করতে চাই
লক্ষ্মীকান্ত ডাঙ্গে

কোন জেএস ইঞ্জিনগুলি যখন a.length=0;সম্পাদনা করা হবে তখন একটি নতুন অ্যারে তৈরি করবে তা নিশ্চিত করার জন্য আপনার কোনও উত্স আছে ? এই ইঞ্জিনগুলি কীভাবে কাজ করবে a.length=500;এবং a.length=4;?
জোয়েটউইডল

আমি এটি 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() : শিফট পদ্ধতিতে উপাদানটিকে সরিয়ে দেয় শূন্যতম সূচকে একটানা সূচকে মানগুলি নীচে নামিয়ে দেয়, তারপরে সরানো মানটি ফেরত দেয় returns

উদাহরণ:

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);

"দৈর্ঘ্য: একটি অ্যারের দৈর্ঘ্য পর্যন্ত পোপগুলি নির্দিষ্ট আকারের হয়" " আপনাকে এই বাজে কথা কে বলেছে?
বেকিম বাকাজ

@ বেকিমবাজাজ সংক্ষেপে, এটি একই প্রভাব ফেলে। এটা সম্ভবত ন্যায়বিচারের length = ?পরিবর্তে বলা উচিত ছিল length
টুপুর্টুনট

@ বেকিমবাজ আমি আমার উত্তরটি আপডেট করেছি, আমি সবেমাত্র ধরে নিয়েছি যে দৈর্ঘ্য দৈর্ঘ্য পর্যন্ত পপ হবে, তবে আমি এখন সংশোধন করেছি যে দৈর্ঘ্যটি কেবল অ্যারের আকারকে কাটবে বা বাড়িয়ে তুলবে।
যশ

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
এটি একটি ভিন্ন প্রশ্নের উত্তরের উত্তর হতে পারে: "অ্যারেতে সমস্ত উপাদানকে কীভাবে সংজ্ঞায়িত উপাদানগুলিতে রূপান্তর করা যায়"।
রুবেন

যদিও অভ্যন্তরীণভাবে
অপরিজ্ঞাত

-9

আপনার যদি কৌনিক 2+ ফর্মআরে খালি করতে হয় তবে নীচে ব্যবহার করুন।

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

10
এটি অপ্রাসঙ্গিক এবং এমনকি জাভাস্ক্রিপ্টও নয়।
এমিল বার্গারন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.