Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Текст после последней точки (https://javascript.ru/forum/misc/52116-tekst-posle-poslednejj-tochki.html)

TimohaP 04.12.2014 19:21

Текст после последней точки
 
Тут скорее всего прийдется делать регулярками. Короч вот в чем дело: скрипту дается ссылка на файл, а он должен вернуть его расширение. Например:
image.jpg - вернет jpg
file:///d:/word.doc - вернет doc
jquery.min.js - вернет js

Safort 04.12.2014 19:36

var url = 'file:///d:/word.doc'.split('.');
alert(url[url.length-1]);

devote 04.12.2014 19:37

Safort,
Только если точек больше чем одна... неожиданно получишь иной результат. )

Safort 04.12.2014 19:40

devote,
точно?)
var url = 'file:///d:/w.o.r.d.doc'.split('.');
alert(url[url.length-1]);

devote 04.12.2014 19:43

Цитата:

Сообщение от Safort
точно?)

Удивительно. Похоже исправили метод. А то ранее он работал иначе. Разбивал лишь по первому найденному вхождению... либо я что то путаю.

Ну хорошо, а если вообще точек не будет?

Safort 04.12.2014 19:52

devote,
Цитата:

Ну хорошо, а если вообще точек не будет?
То это совсем другая задача. Тут нужно найти расширение(согласно примерам), мой код его находит, все радуются, а ты нет ;(

devote 04.12.2014 19:57

Safort, твой пример можно упростить
var ext = 'file:///d:/w.o.r.d.doc'.split('.').pop();
alert(ext);

Ну а так если все же нужен правильный функционал:
var url = 'file:///d:/w.o.r.d.doc';
var ext = (ext = url.split('.')).length > 1 ? ext.pop() : '';
alert(ext);

var url = 'file:///d:/doc';
var ext = (ext = url.split('.')).length > 1 ? ext.pop() : '';
alert(ext);

krutoy 04.12.2014 20:07

Цитата:

Сообщение от devote
Ну а так если все же нужен правильный функционал:

Тогда уж проще регулярку
url.match(/\.([a-z]+)$/i)[1]

Safort 04.12.2014 20:09

devote,
за pop() спасибо, совсем забыл про него)

devote 04.12.2014 20:25

Цитата:

Сообщение от krutoy
Тогда уж проще регулярку

регулярки кушают процессор/память компа... Ради разбиения строки по точкам, нет смысла заставлять интерпретатор создавать экземпляр регулярки, распарсивать регулярку, потом делать десяток проходов на поиск совпадения... Тогда когда split делает лишь один проход, не инициализирует парсер регулярки и т.д.

krutoy 04.12.2014 21:04

Цитата:

Сообщение от devote
регулярки кушают

ага, отличный повод создавать стены лапши на каждую мизерную проверку. В оптимизации тоже меру надо знать

devote 04.12.2014 21:14

Цитата:

Сообщение от krutoy
создавать стены лапши

где ты увидел лапшу?

Цитата:

Сообщение от krutoy
В оптимизации тоже меру надо знать

вот когда пойдешь работать туда где крупный проект и каждая мс на счету, я тогда на тебя посмотрю. Там где я сейчас работаю, у нас оптимизация одна из важнейших частей кодинга. Потому что приложения объемные, функционалом обширны и вот такие части кода что предлагаешь ты, будут сжирать не мало проц. времени, что для наших проектов ни в коем случае не приветствуется...

Конечно для мелких сайтиков эта оптимизация не значительна, и не особо требуется. Но все же нужно уметь и знать как обходится без регулярных выражений. И при возможности их не использовать.

krutoy 04.12.2014 21:20

devote,
К тому же, во первых, по поводу перфоманса еще можно поспорить. Во вторых, код с регулярками тоже может быть оптимизирован
var url = 'file:///d:/w.o.r.d.doc';


i=1000000
console.time('my stupid')
while(i--){
url.match(/\.([a-z]+)$/i)[1]
}
console.timeEnd('my stupid')

i=1000000
re=/\.([a-z]+)$/i
console.time('my better')
while(i--){
url.match(re)[1]
}
console.timeEnd('my better')



i=1000000
console.time('yours')
while(i--){
var ext = (ext = url.split('.')).length > 1 ? ext.pop() : '';
}
console.timeEnd('yours')
//в ноде:
//  my stupid: 423ms
//  my better: 401ms
//  yours: 425ms

В третих, во большинстве случаев можно обойтись тестом, а матчить только в поседнюю очередь. А так по любому будет быстрей.
Цитата:

Сообщение от devote
где ты увидел лапшу?

она накапливается незаметно.
Цитата:

Сообщение от devote
каждая мс на счету

Думаю, это говорит о фатальных недостатках архитектуры, в подавляющем большинстве случаев, если речь не идет о специализированном проекте, заточенном на максимальную производительнось.

Safort 04.12.2014 21:26

devote,
Цитата:

Удивительно. Похоже исправили метод. А то ранее он работал иначе. Разбивал лишь по первому найденному вхождению... либо я что то путаю.
Путаешь, наверно, с этим http://habrahabr.ru/post/231071/#comment_7810751

TimohaP 04.12.2014 21:27

вот никогда бы не додумался делать split'ом

Safort 04.12.2014 21:30

TimohaP,
постоянно так делаю, чтобы регулярки не писать :D

krutoy 04.12.2014 21:44

TimohaP,
Ага, выручает в примитивных случаях, типа вашего, или, например,
alert("1111/2222/3333/4444".split("/").reverse().join("/"))

Но шаг вправо -- наг влево,
alert("1111222233334444".replace(/(1+)(2+)(3+)(4+)/, "$4$3$2$1"))

и уже облом.
и даже вот это 1111/2222/3333/4444/ вы за*тесь реверсить сплитом
Так что особо не расчитывайте на него, в плане работы с текстом. Хотя в js split -- мощная, и юзабельная конструкция, она много че может, это да.

bes 04.12.2014 21:46

devote,

var url = "file:///d:/w.o.r.d.doc";

console.time("time1");
var ext1 = url.split('.').pop();
console.log(ext1);
console.timeEnd("time1");

console.time("time2");
var ext2 = url.slice(url.lastIndexOf(".") + 1);
console.log(ext2);
console.timeEnd("time2");


Цитата:

chrome 39
doc
time1: 3.577ms
doc
time2: 0.144ms

var url = "file:///d:/w.o.r.d.doc";

console.time("time2");
var ext2 = url.slice(url.lastIndexOf(".") + 1);
console.log(ext2);
console.timeEnd("time2");

console.time("time1");
var ext1 = url.split('.').pop();
console.log(ext1);
console.timeEnd("time1");


Цитата:

chrome 39
doc
time1: 3.499ms
doc
time2: 0.124ms

в ff34 всегда разница в 0.01-0.02 ms

devote 04.12.2014 22:06

Цитата:

Сообщение от krutoy
К тому же, во первых, по поводу перфоманса еще можно поспорить.

ладно согласен, первый мой вариант не удачны, а вот этот обойдет регулярки:
var url = "file:///d:/w.o.r.d.doc";
alert((ext = url.lastIndexOf('.')) !== -1 ? url.substr(ext + 1) : '');

bes, уже предложил его выше)
var url = "file:///d:/w.o.r.d.doc";

i=1000000
re=/\.([a-z]+)$/i
console.time('my better')
while(i--){
var ext = url.match(re)[1]
}
console.log(ext);
console.timeEnd('my better')
 
 
 
i=1000000
console.time('yours')
while(i--){
var ext = (ext = url.lastIndexOf('.')) !== -1 ? url.substr(ext + 1) : ''
}
console.log(ext);
console.timeEnd('yours')

krutoy 04.12.2014 22:13

Цитата:

Сообщение от devote
этот обойдет регулярки:

Дело не в том, обойдет или нет, а в том, что не стоит экономить на копейках. Первоначально вообще надо писать не задумываясь о скорости, и лишь потом, если она недостаточна, приступать к оптимизации.

Парсинг текста без регулярок может стать хорошим интеллектуальным упражнением, (правда, тут больше подходит не сахар языка, а что нибудь более суровое, например, обработка и перебор списков), но практического значения это не имеет.

devote 04.12.2014 22:20

Цитата:

Сообщение от krutoy
Первоначально вообще надо писать не задумываясь о скорости, и лишь потом, если она недостаточна, приступать к оптимизации.

ну если уж на то пошло, то тесты приводишь ты а не мы... Я лишь говорю о том что и без регулярок есть более быстрые способы. Да мой первый вариант был не айс. Но лучше себя приучать к написанию уже оптимального кода. А уж потом оптимальный можно еще оптимизировать. А не писать на jQuery а потом переписывать на VanilaJS (просто аналогия).

Цитата:

Сообщение от krutoy
но практического значения это не имеет.

не соглашусь, писали мы тут компонент Грид, там как раз работа с коллекцией, много всяких разных способов придумывалось что бы оптимизировать работу с огромными данными.

krutoy 04.12.2014 22:33

Цитата:

Сообщение от devote
Но лучше себя приучать к написанию уже оптимального кода

Надо приучать себя к написанию максимально выразительного кода, к построению абстракций максимальной глубины, и надо приучить себя не забивать голову скоростью, не дать этим мыслям завладеть тобой, не позволить им стать навязчивой идеей. То есть, все с точностью до наоборот.
Цитата:

Сообщение от devote
то тесты приводишь ты а не мы.

Я привел их в как аргумент на Ваше безапеляционное заявление, не я начал разговор о производительности.

ЗЫ кроме того, скорость работы приложения, в целом, зависит не столько от мелких оптимизаций, сколько от хорошо продуманной архитектуры.

Safort 04.12.2014 22:48

krutoy,
Цитата:

Надо приучать себя к написанию максимально выразительного кода, к построению абстракций максимальной глубины, и надо приучить себя не забивать голову скоростью, не дать этим мыслям завладеть тобой, не позволить им стать навязчивой идеей.
А потом говорят, что JS тормозной. Думается мне, что всего должно быть в меру.
Об архитектуре думай, но и о производительности не забывай.

krutoy 04.12.2014 22:50

Цитата:

Сообщение от Safort
но и о производительности не забывай.

А я и не говорю, что надо забыть, но вспоминать о ней в последнюю очередь.

Safort 04.12.2014 22:52

krutoy,
.. в день релиза)

krutoy 04.12.2014 22:57

Цитата:

Сообщение от Safort
А потом говорят, что JS тормозной.

Кстати, сдается мне, что об этом сейчас говорит только последнее ламерье. JS уже вплотную к си приближается. О производительности ноды по сравнению с другими серверами я вообще молчу.

Сейчас все больше говорят о неосиляторстве ООП в JS, об этом чаще всего я слышу. А причина тому проста: основная масса ноющих -- выходцы из статичных быдлоязыков типа жабы.

tsigel 04.12.2014 23:29

krutoy,
Что - что, а Java ну никак не быдлоязык) php так иногда называют, но java там и рядом не валялась

krutoy 05.12.2014 00:13

tsigel,
это всего лишь твое мнение.

bes 05.12.2014 00:31

Цитата:

Сообщение от krutoy
быдлоязыков типа жабы


krutoy 05.12.2014 00:47

bes,
имеется один пруфец, спецом для тебя

https://pbs.twimg.com/media/Bb1ZlLhCEAA8xX-.jpg:large

bes 05.12.2014 01:07

Цитата:

Сообщение от krutoy (Сообщение 344677)
bes,
имеется один пруфец, спецом для тебя


и в чём пруф?
в том что медленно летает при первых запусках, так уже сейчас не так и медленно и с каждым запуском всё быстрее
про ide вообще чушь, пиши в блокноте и компилируй из командной оболочки, если так больше нравится

про быдловость самого языка лучше растолкуй, или ты хотел указывать тип в статически типизируемом языке и не писать дополнительных символов при этом что ли :D


Часовой пояс GMT +3, время: 08:15.