หวังว่าแบบสองทิศทางindexOf
/ lastIndexOf
ทางเลือกที่เร็วขึ้น
2015
ในขณะที่วิธีการใหม่รวมถึงดีมากการสนับสนุนเป็นศูนย์สำหรับตอนนี้
เป็นเวลานานที่ฉันคิดถึงวิธีที่จะแทนที่ฟังก์ชัน indexOf / lastIndexOf ที่ช้า
พบวิธีที่นักแสดงแล้วดูคำตอบยอดนิยม จากที่ฉันเลือกcontains
ฟังก์ชั่นที่โพสต์โดย @Damir Zekic ซึ่งน่าจะเร็วที่สุด แต่มันก็ยังระบุว่ามาตรฐานมาจากปี 2008 และล้าสมัย
ฉันชอบwhile
มากกว่าfor
แต่ไม่ใช่เหตุผลเฉพาะที่ฉันสิ้นสุดการเขียนฟังก์ชันด้วย for for loop 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