एक उम्मीद से तेज बोली-प्रक्रिया indexOf
/ lastIndexOf
विकल्प
2015
जबकि नई विधि में शामिल बहुत अच्छा है, समर्थन मूल रूप से अभी के लिए शून्य है।
यह लंबे समय से है कि मैं धीमी indexOf / lastIndexOf फ़ंक्शन को बदलने का तरीका सोच रहा था।
शीर्ष उत्तर को देखते हुए, एक प्रदर्शनकारी तरीका पहले ही मिल गया है। उन लोगों से मैंने contains
@Damir Zekic द्वारा पोस्ट किया गया फंक्शन चुना जो सबसे तेज़ होना चाहिए। लेकिन यह भी कहा गया है कि बेंचमार्क 2008 से हैं और इसलिए पुराने हैं।
मैं भी पसंद करते हैं while
अधिक for
है, लेकिन नहीं एक विशिष्ट कारण के लिए मैं पाश के लिए एक साथ समारोह लेखन समाप्त। यह भी एक के साथ किया जा सकता है while --
।
अगर मैं इसे करते समय सरणी के दोनों किनारों की जाँच करता था तो पुनरावृत्ति बहुत धीमी थी, मैं उत्सुक था। जाहिरा तौर पर नहीं, और इसलिए यह फ़ंक्शन शीर्ष मतदान वाले लोगों की तुलना में लगभग दो गुना तेज है। जाहिर है कि यह मूल निवासी की तुलना में भी तेज है। यह एक वास्तविक दुनिया के माहौल में, जहां आप कभी नहीं जानते हैं कि आप जो मूल्य खोज रहे हैं वह शुरुआत में है या सरणी के अंत में है।
जब आप जानते हैं कि आपने किसी सरणी को केवल मान के साथ धकेला है, तो lastIndexOf का उपयोग करना संभवतः सबसे अच्छा समाधान है, लेकिन यदि आपको बड़ी सरणियों के माध्यम से यात्रा करना है और परिणाम हर जगह हो सकता है, तो यह चीजों को तेज करने का एक ठोस समाधान हो सकता है।
द्विदिश indexOf / 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