බලාපොරොත්තු සහගත වේගවත් ද්විපාර්ශ්වික indexOf
/ lastIndexOf
විකල්පයක්
2015
නව ක්රමයට ඇතුළත් කිරීම ඉතා කදිම වුවත්, දැන් මූලික වශයෙන් සහාය ශුන්ය වේ.
මන්දගාමී දර්ශකය ඕෆ් / අන්තිම ඉන්ඩෙක්ස් ඕෆ් ශ්රිත ප්රතිස්ථාපනය කිරීමේ ක්රමයක් ගැන මා කල්පනා කරමින් සිටියේ බොහෝ කාලයක් ය.
ඉහළ පිළිතුරු දෙස බලන විට දැනටමත් ක්රියාකාරී ක්රමයක් සොයාගෙන ඇත. contains
@ ඩමීර් සෙකික් විසින් පළ කරන ලද ශ්රිතය මම තෝරාගත් අයගෙන් වේගවත්ම එකක් විය යුතුය. එහෙත් මිණුම් සලකුණු 2008 සිට පැවත එන ඒවා යල් පැන ගිය ඒවා බව ද එහි සඳහන් වේ.
මම ද කැමති while
පුරා for
, නමුත් මම පුඩුවක් සඳහා සමග මෙම උත්සවයට ලියන අවසන් විශේෂිත හේතුවක් නැත සඳහා. එය a සමඟ ද කළ හැකිය while --
.
අරාව සිදු කරන අතරතුර දෙපැත්තෙන්ම පරීක්ෂා කර බැලුවහොත් නැවත කිරීම මන්දගාමී වේ දැයි මට කුතුහලයක් ඇති විය. පෙනෙන විදිහට නැත, එබැවින් මෙම ශ්රිතය ඉහළම ඡන්ද දායකයින්ට වඩා දෙගුණයක් වේගවත් වේ. නිසැකවම එය ස්වදේශිකයාට වඩා වේගවත් ය. මෙය සැබෑ ලෝක පරිසරයක, ඔබ සොයන වටිනාකම ආරම්භයේ හෝ අවසානයේ අරාවෙහි තිබේදැයි ඔබ කිසි විටෙක නොදැන සිටිති.
ඔබ වටිනාකමක් සහිත අරාවක් තල්ලු කළ බව ඔබ දන්නා විට, lastIndexOf භාවිතා කිරීම හොඳම විසඳුම ලෙස පවතී, නමුත් ඔබට විශාල අරා හරහා ගමන් කළ යුතු අතර ප්රති result ලය සෑම තැනකම තිබිය හැකි නම්, මෙය දේවල් වේගවත් කිරීමට ස්ථිර විසඳුමක් විය හැකිය.
ද්විපාර්ශ්වික දර්ශකයOf / lastIndexOf
function bidirectionalIndexOf(a, b, c, d, e){
for(c=a.length,d=c*1; c--; ){
if(a[c]==b) return c; //or this[c]===b
if(a[e=d-1-c]==b) return e; //or a[e=d-1-c]===b
}
return -1
}
//Usage
bidirectionalIndexOf(array,'value');
කාර්ය සාධනය ටෙස්ට්
http://jsperf.com/bidirectionalindexof
පරීක්ෂණය ලෙස මම 100k ඇතුළත් කිරීම් සහිත අරාවක් නිර්මාණය කළෙමි.
විමසුම් තුනක්: ආරම්භයේ දී, මැද හා අරාව අවසානයේ.
ඔබත් මෙය සිත්ගන්නාසුළු යැයි සොයාගෙන කාර්ය සාධනය පරීක්ෂා කරනු ඇතැයි මම බලාපොරොත්තු වෙමි.
සටහන: ඔබ දැක ගැනීමට හැකි වන පරිදි මම තරමක් වෙනස් contains
(එසේ මූලික වශයෙන් indexOf සහ lastIndexOf ප්රතිදානය පිළිබිඹු කටයුතු කිරීමට true
සමග index
හා false
සමග -1
). එය හානියක් නොවිය යුතුය.
අරාව මූලාකෘති ප්රභේදය
Object.defineProperty(Array.prototype,'bidirectionalIndexOf',{value:function(b,c,d,e){
for(c=this.length,d=c*1; c--; ){
if(this[c]==b) return c; //or this[c]===b
if(this[e=d-1-c] == b) return e; //or this[e=d-1-c]===b
}
return -1
},writable:false, enumerable:false});
// Usage
array.bidirectionalIndexOf('value');
සත්ය හෝ අසත්ය හෝ වස්තුව, නූල හෝ එය කුමක් වුවත් ආපසු ලබා දීම සඳහා ශ්රිතය පහසුවෙන් වෙනස් කළ හැකිය.
මෙන්න while
ප්රභේදය:
function bidirectionalIndexOf(a, b, c, d){
c=a.length; d=c-1;
while(c--){
if(b===a[c]) return c;
if(b===a[d-c]) return d-c;
}
return c
}
// Usage
bidirectionalIndexOf(array,'value');
මෙය කළ හැක්කේ කෙසේද?
අරාව තුළ පරාවර්තනය වූ දර්ශකය ලබා ගැනීම සඳහා සරල ගණනය කිරීම ඉතා සරල යැයි මම සිතමි.
පුනරාවර්තනයකට චෙක්පත් තුනක් කරන සංකීර්ණ උදාහරණයක් මෙන්න, නමුත් මෙය කළ හැක්කේ කේතය මන්දගාමී වීමට හේතු වන දිගු ගණනය කිරීමකින් පමණි.
http://jsperf.com/bidirectionalindexof/2