Başka bir dizgiden “StartsWith” dizgisi nasıl kontrol edilir? | tutuappapks.com
Not: Bu eski bir sorudur ve ECMAScript 2015 (ES6) tarafından sunulan yorumlarda belirtildiği gibi .startsWith yöntem. Ancak, bu güncellemenin yazıldığı sırada (2015) tarayıcı desteği tamamlanmış olmaktan uzak.
ECMAScript 6'ları kullanabilirsiniz String.prototype.startsWith() yöntem, ama henüz tüm tarayıcılarda desteklenmiyor. Onu desteklemeyen tarayıcılara eklemek için bir shim / polyfill kullanmak istersiniz. İle uyumlu bir uygulama oluşturma spekülasyonda yer alan tüm detaylar biraz karmaşık ve bu cevapta tanımlanan sürüm bunu yapmayacak; sadık bir şim istiyorsanız, aşağıdakilerden birini kullanın:
Matthias Bynens'in String.prototype.startsWith laynerveya
ES6-takozdahil olmak üzere, mümkün olduğunca ES6 spec kadar sarar String.prototype.startsWith.
Yerel ile JSPerf startsWith: jsperf.com/js-startwith-prototype/8 - JimmyBoh
@gtournie neden bir dizge bir dizeyle başlayıp başlamadığını test etmenin en kötü yöntemlerinden biri olacak mı? (burada yorumunuza bakın: stackoverflow.com/questions/646628/...) Karakter başına karakter karşılaştırmak konusunda daha hevesli. derler, her dizge [indeks] için bir dize oluşturmak için yeterince akıllı olmadıklarını çünkü eğer şunu yazarsanız: karakter = string  bir obje tahsis eder, infazitly beginWith kullanmaktan daha az verimli (startWith herhangi bir bellek ayırmaz ) - Martijn Scheffer
@MartijnScheffer: Cevap verdiğimden bu yana birçok kez düzenlenmiş ve şimdi tamamen farklı (yorumumu kaldırdım;). ECMAScript 6'ların start yönteminin bunu yapmanın en iyi yolu olduğuna katılıyorum. - gtournie
@Marcus, yanılıyor olsaydım özür dilerim - bilgilerim geldi: w3schools.com/jsref/jsref_startswith.asp - Graham Laight
İle başka bir alternatif .lastIndexOf:
Bu geriye doğru görünüyor haystack bir oluşumu için needle dizinden başlayarak 0 arasında haystack. Diğer bir deyişle, sadece kontrol eder haystack ile başlar needle.
Prensip olarak, bu diğer bazı yaklaşımlara göre performans avantajlarına sahip olmalıdır:
Tümünde arama yapmıyor haystack.
Yeni bir geçici dize oluşturmaz ve hemen atılır.
@ Rfcoder89'un hangi durumda olduğuna emin değil - jsfiddle.net/jkzjw3w2/1 - Gulfaraz Yasin
@ rfcoder89 lastIndexOf'in ikinci parametresine dikkat edin: "aba".lastIndexOf ("a") işaret ettiğin gibi 2, ama "aba".lastIndexOf ("a", 0) 0, hangisi doğru - maxpolk
Çok teşekkür ederim. String.startsWith Android lolipop WebView üzerinde çalışmıyor, ancak bu lastIndexOf parçacığı yok! - Herman
ile lastIndexOf dize, sondan baştan sonuna kadar aranır, böylece tüm dizeyi arar: bu yüzden verimsizliği aramak için çok uzun dizeler için büyür. - willy wonka
@willywonka Hayır, 0 startIndex'iniz yok, 0'dan arandı ve tek onay. Tüm dize yalnızca fromIndex> = str.length ise aranır. - greene
@ANeves Şüphelendiğim tarayıcıya ve kullanılan verilere bağlı. Gerçek ölçümler için Ben Weaver'ın cevabını görün. Şu anda çalışmakta olduğum tarayıcıda (Chrome 12.0.742, Windows) altyazı, başarı için hazırlandı ve başarısızlık için hazırlanmış normal ifade kazanır. - cobbal
@cobbal Belki. Fakat .lastIndexOf(input, 0) ilk N karakterini karşılaştırır. .substring(0, input.length) === input N sayıyor, verileri N uzunluğuna dizer ve sonra bu N karakterlerini karşılaştırır. Kod optimizasyonu olmadığı sürece, bu ikinci sürüm diğerinden daha hızlı olamaz. Beni yanlış anlamayın, asla kendime önerdiğinden daha iyi bir şey bulamazdım. :) - ANeves
@ANeves Ancak .lastIndexOf, false döndürecek olan uzun bir dizgede tüm dizgenin (O (N)) üzerinde yineleme yaparken, .substring durumu potansiyel olarak çok daha küçük bir dizede yinelenir. Eğer çoğunluk başarıları veya sadece küçük girdiler bekliyorsanız, .lastIndexOf muhtemelen daha hızlıdır - aksi takdirde .substring daha hızlıdır. .substring ayrıca giriş kontrol edilen dizeden daha uzunsa bir istisna da risk oluşturur. - Chris Moschini
Mark'ın üzerinde kobbal çözümünü tercih ederim. İşaretler daha hızlı olsa ve parazitleri kullanan etkileyici bir numara olsa bile, alt dizeyle karşılaştırıldığında okunması çok zordur. - ThinkBonobo
Bir yardımcı işlevi olmadan, sadece regex'in .test yöntem:
Bunu kodlanmış bir kod yerine dinamik bir dizeyle yapmak için (dizenin herhangi bir regexp denetim karakteri içermediğini varsayarak):
Sadece bu konuda fikrimi eklemek istedim.
Sanırım şu şekilde kullanabiliriz:
Mark Byers yanıtı, @relfor tarafından üç farklı doğru yaklaşımın performansı için karşılaştırıldı. Bu doğru yaklaşım, tüm dizinin aranmasını gerektirdiği için tercih edilmedi. - maxpolk
@maxpolk bence indexOf ilk varlığı bulduğunda tüm dizgeyi aramayı durdurur. Kontrol ettim. - Mr.D
Eğer ilk oluşum en başlarda bulunmazsa, bu yaklaşım, daha uzun süre vazgeçmek yerine, aramaya devam edene kadar potansiyel olarak arama yapmaya devam ederse, verimsiz olmaya başlar. Verimsizlik potansiyeli olduğundan, üç doğru yaklaşım arasında tercih edilmemektedir. - maxpolk
@ Mr.D Ve eşleşme yoksa? - momo
@momomo Sonra ekle else kodu. - Mr.D
En iyi çözüm:
Ve işte endswith eğer buna da ihtiyacınız varsa:
Onu dize prototiplemeyi tercih edenler için:
Sanırım, fonksiyonlarınızda lastIndexOf ve indexOf'leri karıştırdınız - başlarsa, geri dönmelisiniz str.indexOf (word, 0) === 0; - Richard Matheson
@RichardMathes, indexOf kullanarak sorunu çözerse, başlangıçta eşleşme başarısız olursa, tüm dizgeyi aramaya devam edecektir, burada lastIndexOf sözcüğün uzunluğundan başlar ve sıfıra geri döner. Anladım? - momo
Ahh evet şimdi mantıklı - kullandığınız indekslere dikkat etmedim. Çok güzel numara! - Richard Matheson
İşte CMS'nin çözümüne küçük bir gelişme:
Gelecekteki bir tarayıcının bunu yerel kodda uyguladığı veya başka bir kitaplık tarafından uygulandığı durumda zaten var olan işlevin kontrol edilip edilmediğini kontrol etme. Örneğin, Prototip Kitaplığı zaten bu işlevi uygular.
kullanma ! biraz daha hızlı ve daha özlü === 0 okunabilir değil.
Bu bir sorun olabilir: Eğer zaten uygulanmış olan uygulama kendi başıma farklı davranıyorsa, bu benim başvurumu kırdı. - Christoph Wurm
kullanarak! çok dağınık - Jonny Leeds
1; bunu ekleyerek String.prototype Kötü bir fikir çünkü her şeye uymaya yakın bir yere gelmiyor spec için String.prototype.startsWith. ES6 yöntemini kullanmaya çalışan herhangi bir kod, bunu yapıyorsanız başarısız olabilir; Yöntemin önceden tanımlanmış olup olmadığına bakabilir, bunun (kötü bir şekilde sizin tarafınızdan) olduğunu görebilir ve daha sonra yanlış davranışa yol açacak şekilde özel bir şemayı eklemeyebilirsiniz. - Mark Amery
Bu iyi değil. - momo
Ayrıca check out underscore.string.js. Dahil bir dizi kullanışlı dizi testi ve manipülasyon yöntemleri ile birlikte gelir. startsWith yöntem. Dokümanlardan:
ile başlar _.startsWith(string, starts)
Bu yöntem olup olmadığını kontrol eder. string ile başlar starts.
ihtiyacım vardı _.string.startsWith - Colonel Panic
Son zamanlarda kendime aynı soruyu sordum.
Birden fazla olası çözüm var, burada 3 geçerli olanı:
s.lastIndexOf(starter, 0) === 0 (Mark Byers'ın gördükten sonra eklendi Cevap)
bir döngü kullanarak:
Bir döngüden yararlanan son çözümle karşılaşmadım.
Şaşırtıcı bir şekilde bu çözüm ilk 3'ü önemli bir marjla geride bırakıyor.
İşte bu sonuca ulaşmak için yaptığım jsperf testi: http://jsperf.com/startswith2/2
ps: ecmascript 6 (uyum) bir yerel tanıtıyor startsWith dizeleri için yöntem.
İlk versiyonun kendisinde bu çok ihtiyaç duyulan yöntemi dahil etmeyi düşünürsek ne kadar zamanın saklanacağını düşünün.
Steve'in işaret ettiği gibi (bu cevaba ilişkin ilk yorum), yukarıdaki özel işlev, verilen bir hatayı atar. önek tüm dizeden daha kısadır. Bunu düzeltdi ve görüntülenebilir bir döngü optimizasyonu ekledi http://jsperf.com/startswith2/4.
Steve'in dahil ettiği 2 döngü optimizasyonu olduğunu, ikisinden birincisinin daha iyi bir performans gösterdiğini, dolayısıyla bu kodu aşağıya yayınlayacağımı unutmayın:
En son rev. Yukarıdaki sürümdeki hatanın yanı sıra (dizenin önekden daha kısa olması durumunda atılacaktır), daha da optimize edilmiş bir sürümden daha yavaştır. Görmek jsperf.com/startswith2/4 ve jsperf.com/js-startswith/35. - Steve Hollasch
^ Dizenin önekten daha kısa olduğu durumu işaretlediğiniz için teşekkürler - Raj Nathani
jsperf.com/startswith2/29 => beginWith5 özlü ve gerçekten iyi performans gösteriyor =) - gtournie
GetMethods kullanmadan genel bir yöntem alın BIOS güvenlik ayarlarınızda VT-x'i etkinleştirin (bilgisayarınızın belgelerine bakın). Android varsayılan bağlantı stilini web görünümünde kaldırabilir miyim C'deki bir işlevi nasıl parametre olarak geçirirsiniz? OAuth :: Yetkisiz 401 Yetkilendirme OmniAuth-Twitter kullanılarak Rails 3.2'de gerekli NSString'e yüzde işareti nasıl eklenir? R'de bir dizgede değişkenin isminin saklandığı değişken değere erişme