ජාවාස්ක්‍රිප්ට් හි අරාවක් හිස් කරන්නේ කෙසේද?


2197

අරාව හිස් කිරීමට ක්‍රමයක් .remove()තිබේද?

උදාහරණයක් වශයෙන්,

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

මම එය හිස් කරන්නේ කෙසේද?


1
මෙහි විවිධ හැකියාවන් සහිත මිණුම් ලකුණක්: jsben.ch/#/7QyI1
EscapeNetscape

Answers:


4439

පවතින අරාව ඉවත් කිරීමට ක්‍රම 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 ( මැතිව් ක්‍රම්ලි යෝජනා කළ පරිදි )

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 ක්‍රම ක්‍රියාකාරීත්වයේ ඉතා සමාන වන අතර ක්‍රම 4 ට වඩා වේගවත් වේ. මෙම මිණුම් ලකුණ බලන්න . .

ඩයඩිස්ටිස් ඔවුන්ගේ පිළිතුරෙන් පෙන්වා දුන් පරිදි දෝෂ සහගත විය පහත, ක්රම හතරක් කාර්ය සාධනය තීරණය කිරීම සඳහා භාවිතා කරන ලදී බව මුල් මිනුම් දඬු ඉහත විස්තර. මුල් මිණුම් ලකුණ නිෂ්කාශිත අරාව නැවත භාවිතා කළ අතර දෙවන අනුක්‍රමය දැනටමත් හිස්ව තිබූ අරාව ඉවත් කරයි.

පහත දැක්වෙන මිණුම් ලකුණ මෙම දෝෂය නිරාකරණය කරයි: http://jsben.ch/#/hyj65 . # 2 (දිග දේපල) සහ # 3 (බෙදීම්) ක්‍රම වේගවත් බව එය පැහැදිලිව පෙන්වයි (මුල් අරාව වෙනස් නොකරන # 1 ගණනය කිරීමේ ක්‍රමය නොවේ).


මෙය උණුසුම් මාතෘකාවක් වී ඇති අතර විශාල ආන්දෝලනයක් ඇතිවීමට හේතුවකි. ඇත්ත වශයෙන්ම නිවැරදි පිළිතුරු බොහෝමයක් ඇති අතර මෙම පිළිතුර පිළිගත් පිළිතුර ලෙස දීර් time කාලයක් තිස්සේ සලකුණු කර ඇති හෙයින්, මම මෙහි සියලු ක්‍රම ඇතුළත් කරමි. ඔබ මෙම පිළිතුරට ඡන්දය දෙන්නේ නම්, කරුණාකර මා සඳහන් කළ අනෙක් පිළිතුරු ද ඉදිරිපත් කරන්න.


185
while (A.length) { A.pop(); }, අවශ්‍ය නැත> 0
අයිවන් බ්ලැක්

327
> 0වඩාත් කියවිය හැකි IMHO වේ. ඒ දෙක අතර කාර්ය සාධන වෙනසක් නැත.
පිලිප් ලේබර්ට්

10
ag ඩගන්, ඔබ කියන්නට උත්සාහ කරන්නේ කුමක්ද යන්න කිසිසේත් පැහැදිලි නැත. අළුත් එකක් bපැවරීමෙන් පසුව පවා පැරණි අරාව පිළිබඳ සඳහනක් දරයි a. cහා dදිගටම එම අරාව අදාල කිරීමට. එබැවින් ප්‍රතිදානයන්හි වෙනස අපේක්ෂා කෙරේ.
shovavnik

9
IeDiegoJancic Method # 1 ගණනය කරන්නේ එය අරාව ඉවත් නොකරන බැවිනි. එය නව එකක් නිර්මාණය කරයි. එය මිණුම් ලකුණකට ඇතුළත් නොකළ යුතුය.
පිලිප් ලේබර්ට්

44
while(A.pop())අරාවෙහි ඇති අයිතමයක් වැරදියි නම් ඔබට භාවිතා කළ නොහැක . උදාහරණයක් ලෙස A = [2, 1, 0, -1, -2] ප්‍රති A ලයක් ලෙස A සමාන වේ [2, 1]. while(A.pop() !== undefined)සාරධර්මවලින් එකක් ලෙස නිර්වචනය කර නොමැති පෙළක් ඔබට තිබිය හැකි නිසා පවා එය ක්‍රියා නොකරයි. සම්පාදකයා එය ප්‍රශස්තිකරණය නොකිරීමට හේතුව.
ජොනතන් ගැව්රිච්

2465

ඔබට මුල් අරාව තබා ගැනීමට අවශ්‍ය නම් එය යාවත්කාලීන කළ යුතු වෙනත් යොමු කිරීම් ඇති බැවින්, එහි දිග බිංදුවට සැකසීමෙන් නව අරාවක් නිර්මාණය නොකර ඔබට එය ඉවත් කළ හැකිය:

A.length = 0;

18
ECMAScript 5 ස්ටෑන්ඩර්ඩ් මේ ගැන පවසන්නේ කුමක්ද?
පැසීරියර්

213
Ac පැසීරියර්: එය තවමත් ES5 හි ක්‍රියාත්මක වේ. 15.4 වගන්තියෙන්: "... දිග දේපල වෙනස් වන සෑම විටම, නව දිගට වඩා කුඩා නොවන අරාව දර්ශකයක් වන සෑම
දේපලක්ම

2
ineinar: ජාවාස්ක්‍රිප්ට් අරා සෑම විටම ඔබ ඒවා දැමූ ඕනෑම දෙයකට ගැලපෙන පරිදි පුළුල් වේ, එබැවින් ඔබ myarray.push(whatever)එය අමතන විට එය දිගට එක් කරයි. එබැවින් දිග සැකසීම අරාව කපා දමයි, නමුත් එය ස්ථිර නොවේ.
මැතිව් ක්‍රම්ලි

12
OsLosManos දැඩි මාදිලියේ lengthවුවද විශේෂ දේපලක් වන නමුත් කියවීමට පමණක් නොවේ, එබැවින් එය තවමත් ක්‍රියාත්මක වේ.
මැතිව් ක්‍රම්ලි

11
AtMattewCrumley මම යම් පරීක්ෂණයක් කළ අතර, එය පෙනෙන්නේ a.length = 0 යනු සම්පූර්ණ අරාව කාර්යක්ෂමව ඉවත් කිරීම නොවේ. jsperf.com/length-equal-0-or-new-array මම හිතන්නේ ඔබට එක් ප්‍රතිරෝධයක් තිබේ නම් (සහ ඔබ තබා ගැනීමට අවශ්‍ය අමතර ගුණාංග ඔබ එකතු කර නැත), නව අරා නිර්මාණය කිරීම වඩා හොඳය, සහ පැරණි දේ කසළ එකතු කරන්නා, සුදුසු විට එය ක්‍රියාත්මක වේ.
පෝල් බ rew ක්සින්ස්කි

289

මෙහි වේගවත්ම වැඩ ක්රියාත්මක කිරීම අතර එම අරාව තබා ( "mutable"):

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

FYI එය සරල කළ නොහැක while (array.pop()): පරීක්ෂණ අසාර්ථක වනු ඇත.

FYI සිතියම සහ සෙට් අර්ථ දැක්වීම 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);
  });
});

මෙන්න යාවත්කාලීන කරන ලද jsPerf: http://jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152


5
ඔබේ පිළිතුර නිවැරදි හා වේගවත් (එකම අවස්ථාවේ) එකම පිළිතුර වන නමුත් ඊට වඩා අඩු “උඩු යටිකුරු” ඇත. හොඳයි, මිනිසුන් මන්දගාමී විසඳුම් වලට කැමති බව පෙනේ: /
obenjiro

omnaomik නමුත් මෙය මූලික ක්‍රියාකාරිත්වයන්ගෙන් එකක් වන අතර එය පෙරනිමියෙන් තිබිය යුතුය.
thefourtheye

7
performancethefourtheye කාර්ය සාධනය සඳහා හොඳ විසඳුමක්, මම ඕනාමික් සමඟ එකඟ වුවද, ඔබ ස්වදේශීය වස්තු වෙනස් නොකළ යුතුය. එය තිබිය යුතු යැයි පැවසීම කාරණය පසෙකින් තිබේ, ගැටලුව වන්නේ ඔබ ගෝලීය වෙනස් කිරීමයි , එය නරක ය. ඔබ ඔබේ කේතය අන් අයට භාවිතා කිරීමට ලබා දෙන්නේ නම්, එය අනපේක්ෂිත අතුරු ආබාධ ඇති නොවිය යුතුය. වෙනත් පුස්තකාලයක් වෙනස් කර Array.prototypeඑය තරමක් වෙනස් දෙයක් කරන්නේ නම් සිතා බලන්න , එවිට ඔබේ කේතය පුරාම ඇති සියල්ල [].clear()තරමක් වැරදිය. නිදොස් කිරීම සඳහා මෙය විනෝදයක් නොවනු ඇත. ඉතින්, සාමාන්‍ය පණිවිඩය නම්: ගෝලීය වෙනස් නොකරන්න.
jpillora

3
fthefourtheye ගෝලීය විෂය පථය වෙනස් නොකිරීමේ සමස්ත කාරණය වන්නේ වෙනත් කෙනෙකුගේ කේතය දැනටමත් නම භාවිතා කර ඇත්දැයි ඔබ නොදැන සිටීමයි . දේශීය විෂය පථය තුළ ශ්‍රිතයක් යෝජනා කරමි. එබැවින්, ඔබගේ යෙදුමේ / පුස්තකාලයේ IIFE තුළ , කරන්න function clear(arr) { while(arr.length) arr.pop(); }, ඒ clear(arr)වෙනුවට අරා ඉවත් කරන්න arr.clear().
jpillora

2
එය මෙම ක්රමය ගොඩක් මන්දගාමී වඩා හැරෙනවා .splice()හා .length=0. මිණුම් සලකුණු නිවැරදි නොවේ. මගේ යාවත්කාලීන කළ පිළිතුර බලන්න.
පිලිප් ලේබර්ට්

216

වඩාත් හරස් බ්‍රව්සර් හිතකාමී සහ වඩාත් ප්‍රශස්ත විසඳුමක් වනුයේ spliceපහත දැක්වෙන පරිදි A අරාවෙහි අන්තර්ගතය හිස් කිරීමට ක්‍රමය භාවිතා කිරීමයි :

A.splice(0, A.length);


49
මෙය වඩාත් හරස් බ්‍රව්සරයට හිතකර වන්නේ ඇයි? A.length සමඟ ගැටළු ඇති බ්‍රව්සර් මොනවාද?
stricjux

4
m jm2 ඔබ පවසන දේ සම්පූර්ණයෙන්ම සත්‍ය නොවේ. එය සැබවින්ම සැක සහිත අරාව වෙනස් කරන අතර පසුව සියලු යොමු කිරීම් බලපායි. මගේ jsFiddle හි පරීක්ෂණය බලන්න: jsfiddle.net/shamasis/dG4PH
ෂමාසිස් භට්ටාචාර්යා

3
@alex නැත එය සිදු නොවේ, spliceඅරාව වෙනස් කර මකාදැමූ ඇතුළත් කිරීම් නැවත ලබා දෙයි. මෙම ලේඛන පළමු කියවන්න: developer.mozilla.org/en-US/docs/JavaScript/Reference/...
ඩේවිඩ් Hellsing

3
කොමා ක්‍රියාකරු භාවිතා කිරීමෙන් අපට ලැබෙන අරා ආපසු පැමිණීම වළක්වා ගත හැකිය : A.splice(0, A.length),0;. මේ ආපසු අගය නික්ම 0මෙන් A.length = 0;වනු ඇත. එහි ප්‍රති ing ලයක් ලෙස අරාව තවමත් නිර්මාණය වී ඇති අතර එය ස්ක්‍රිප්ට් මන්දගාමී වීමට හේතු විය යුතුය : ( 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
ඔබ යෝජනා කළ විසඳුමේ ඇති එකම ගැටළුව නම් කුණු කූඩය තවමත් පවතින බවය, එය ඔබ කුණු කූඩයක් නොමැති බව පවසමින් දැන්වීම් පුවරුව වෙනස් කිරීම පමණි. පැරණි අරාව පිළිබඳ සඳහනක් තවමත් පැවතිය යුතුය. .Length = 0 සැකසීමේදී කුණු එකතු කරන්නාට අරාව සහ එහි ගුණාංග පිළිබඳ සියලු යොමු කිරීම් ඉවත් කරනු ඇති බවට ඔබට සහතික විය හැකිද? මම හිතන්නේ එය එසේ වුවත් මට එය මැජික් ය. අවම වශයෙන් පැවසීමට ඇති ව්‍යාකූලත්වය වළක්වා ගැනීමට. පැහැදිලි () ක්‍රමයක් යෝග්‍ය වේ.
mmm

8
මෙම විසඳුම වැරදියි කියා මම කිසි විටෙකත් ප්‍රකාශ කළේ නැහැ. ගැටලුව වන්නේ මෙම සම්පූර්ණ නූල් සම්පූර්ණයෙන්ම අනවශ්‍ය වීමයි. ඡන්ද 3000 කට වඩා පෙන්නුම් කරන්නේ හොඳම ක්‍රමය කුමක්දැයි සොයා බැලීමට උත්සාහ කිරීම EMCA ක්‍රැක් හෙඩ් සංවර්ධකයින්ට එවැනි ක්‍රමයක් එකතු කිරීම සඳහා ප්‍රමාණවත් තරම් වලංගු අවස්ථාවක් විය යුතු බවයි. කිසිවෙකුට එය හදුනා ගැනීමට අවශ්‍ය නොවිය යුතුය. එය කිරීමට විවිධ ක්‍රම තුනක් - හතරක් ඇත. සමහර මිණුම් සලකුණු වලදී, දිග විසඳුම් අනෙක් ඒවාට වඩා මන්දගාමී වේ. තවද, ඕනෑම සාධාරණ සංවර්ධකයෙකු සඳහා .length = 0 සැකසීමේ අදහස සතුටුදායක එකක් නොවනු ඇත.
mmm

2
එය කළ යුතු දේ ඉටු කිරීම සඳහා, සියලු යොමු කිරීම් ඉවත් කළ යුතුය. .length = 0 යනු ක්‍රමලේඛ ඇමතුමක් පවා නොවේ, එබැවින් එය 0 ලෙස සකසා ඇති විට වෙනත් ක්‍රියාමාර්ග තිබේ නම් (බොහෝ බ්‍රව්සර් වල අර්ථකථන සැකසුම හරහා ඇත) එය තවමත් විශ්වාස කළ නොහැකි තරම් ඉන්ද්‍රජාලික යැයි මම සිතමි. කරන්න.
mmm

7
ඒ නිසා, මම එය මා විසින්ම ඉවත් කර ගන්නවාට වඩා කැමතියි. පැහැදිලි ක්‍රමයක් මූලාකෘති ගත කළ හැකි නමුත් එය කැතයි. මගේ අදහස නම්, මෙම ක්‍රියාවට නැංවීම දැනටමත් පැවතිය යුතු බැවින් සංවර්ධකයින් 10 000 කට වැඩි පිරිසකට මෙම ත්‍රෙඩ් එක කියවීමට පැය ගණනක් වැය කිරීමට සිදු නොවීය.
mmm

1
ඔබගේ අරාව හිස් කිරීමට ඇත්තේ එක් මාර්ගයක් පමණි, එය නව එන දත්ත වලින් පුරවා නැවත ඉවතලන්න. අනෙක් සියල්ලන්ම එක්කෝ නැත, නැතහොත් හාස්‍යජනක ලෙස අකාර්යක්ෂම හා සමාව දිය නොහැකි cpu කුසගින්නෙන් පෙළෙති. එකම ප්‍රායෝගික විකල්පය වන්නේ A(n) = A.splice( 0, A.length );ඔබේ පෙර අන්තර්ගතය උපස්ථ කිරීමට අවශ්‍ය අවස්ථාවයි. ps Array.lengthයනු ඔබට එම මූලික කරුණ මඟ හැරී ඇත්නම් කියවීමේ-ලිවීමේ දේපලකි. තේරුම, ඔබට එය නව දිගකට විස්තාරණය කළ හැකිය, ඔබට අවශ්‍ය ඕනෑම දිගකට එය කපා දැමිය නොහැක, අනෙක් ඒවා අතර එහි දිග 0 දක්වා කෙටි කිරීමෙන් සියලුම සාමාජිකයන් ඉවත දැමිය හැකිය. එය ස්විට්සර්ලන්තයේ පිහියකි.
බෙකිම් බකාජ්

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-බිට් හි පරීක්ෂා කිරීම, a = [] වේගවත්ම වේ!
රේසා-එස් 4

5
ක්‍රෝම් යටතේ මෙම පරීක්ෂණ ප්‍රති result ලයේ අනිවාර්යයෙන්ම මාළු සහිත යමක් තිබේ. නිරයේ දී පොපිං ලූපය අනෙක් විසඳුම් 3 වඩා වේගවත් වන්නේ කෙසේද?
chqrlie

9
qchqrlie එය එසේ නොවේ. එය මන්දගාමී ක්‍රමයයි. මිණුම් ලකුණ පරීක්ෂණය දෝෂ සහිතය.
පිලිප් ලේබර්ට්

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 ලය වන්නේ:

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

Ar හි අයිතම 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
Array.length = 0 ටයිප් නොකරන්නේ ඇයි?
නිර්මාණය ඒඩ්‍රියන්

10
@naomik "කරුණාකර ස්වදේශික වස්තු වෙනස් කිරීම දිරිමත් නොකරන්න." - මම මේ සමඟ සම්පුර්ණයෙන්ම එකඟ වෙමි, නමුත් වාක්‍යය තනිවම පුනරුච්චාරණය කිරීම අහංකාරය. එවැනි විසඳුමක් යෝජනා කරන කවුරුහරි එහි ප්‍රතිවිපාක ගැන නොදන්නා අතර කෙටි පැහැදිලි කිරීමක් හෝ සබැඳියක් ලබා දීම වෙනුවට මෙම රේඛාව ඔවුන් මතට දැමීම හැර වෙනත් අර්ථයක් ගෙන එන්නේ නැත “අපි, ඔබට වඩා දක්ෂ පුද්ගලයන්, මෙය නොකරන්නැයි ඔබට කියමු, මොකද අපි හොඳට දන්නවා ” .
ජෝන් වයිස්


13

ඔබ භාවිතා කරන්නේ නම්

a = []; 

එවිට ඔබ a වෙත නව අරාව යොමු කිරීමක් ලබා දී ඇත, 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, මෙම නව පිළිතුර නූල් එකට එකතු කරන්නේ කුමක් දැයි මට නොපෙනේ?
බර්ගි

Er බර්ජි මට අරාව පිළිබඳ සත්‍ය මතක නිරූපණය කෙරෙහි අවධානය යොමු කිරීමට අවශ්‍යයි
ලක්ෂ්මිකන්ත් ඩෙන්ජ්

a.length=0;සිදු කරන විට කුමන ජේඑස් එන්ජින් නව අරාවක් නිර්මාණය කරයිද යන්න තහවුරු කිරීමට ඔබට ප්‍රභවයක් තිබේද? එම එන්ජින් ක්‍රියා කරන්නේ කෙසේද a.length=500;සහ a.length=4;කෙසේද?
joeytwiddle

IE, Firefox, Chrome වැනි බොහෝ බ්‍රව්සර් වල මම එය උත්සාහ කළෙමි, එය නව අරා නිර්මාණය කරයි. ඔබ දිග 0 ට වඩා වැඩි නම් එය නිර්වචනය නොකළ මූලද්‍රව්‍යයන්ගෙන් පෙළක් සාදනු ඇත, එනම් එය මතක ස්ථාන කිහිපයක් රඳවා තබා ගනී.
ලක්ෂ්මිකන්ත් ඩෙන්ජ්

1
var a = [1]; var b = a; a.length = 0; console.log(b)මුද්‍රණය කරයි Array [ ], එබැවින් එය මට නව අරාවක් නිර්මාණය කරන බවක් නොපෙනේ.
ජෝන් මොන්ට්ගොමරි

12

A.splice(0);

මම මෙය කරන්නේ මා වැඩ කරන කේතයකිනි. එය අරාව ඉවත් කළේය.


නැත, ඔබ විසින් අලුතින් සාදන ලද නිර්නාමික එකක් සමඟ නම් කරන ලද අරාව බහාලුමක් මාරු කර ඇත. `var A = [1,2,3,4]; var බී; B = A.splice (0); console.log (A); console.log (B); '
බෙකිම් බකාජ්

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

"දිග: අරාවෙහි දිග නිශ්චිත ප්‍රමාණය දක්වා වන තෙක් දිස් වේ." මේ විකාරය ඔබට කීවේ කවුද?
බෙකිම් බකාජ්

EkBekimBacaj සාරාංශයක් ලෙස, එය එකම බලපෑමක් කරයි. එය length = ?සාධාරණ ලෙස වෙනුවට පැවසිය යුතුය length.
ටුපර්ටුනට්

EkBekimBacaj මම මගේ පිළිතුර යාවත්කාලීන කර ඇත්තෙමි, දිග දිග දක්වා විහිදෙන බව මම උපකල්පනය කළෙමි, නමුත් මම දැන් නිවැරදි කළේ එම දිග අරාවෙහි ප්‍රමාණය අඩු කිරීම හෝ වැඩි කිරීම ය.
යෂ්

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+ FormArray හිස් කිරීමට අවශ්‍ය නම් පහත භාවිතා කරන්න.

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

10
මෙය අදාල නොවන අතර ජාවාස්ක්‍රිප්ට් පවා නොවේ.
එමිලි බර්ජරන්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.