Обработка строки веселья - PullRequest
0 голосов
/ 29 апреля 2020

Я использую приведенный ниже код, чтобы попытаться удалить расширение файла с входящего файла и заменить его на «ACK»;

Невозможно использовать .lastIndexOf, так как он недоступен в Rhino.

var _filename       = String(sourceMap.get('originalFilename'));
pos = -1;
var search = ".";

for(var i = 0; i < _filename.length - search.length; i++) {
    if (_filename.substr(i, search.length) == search) {
        pos = i;
    }
}
logger.info('_pos:' + _pos);

Каждый раз, когда я получаю положительное значение -1, т.е. последняя позиция полного останова не найдена.

НО, если я жестко закодирую имя файла как "2020049.259317052.H C .P.F3M147 -G "работает отлично.

Это как-то связано с sourceMap.get ('originalFilename'), предоставляющим нестроковый или другой набор символов?

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

Это было проверено на весе 3.5. На самом деле Rhino имеет String.prototype.lastIndexOf для всех весёлых версий, начиная с версии 3.0. Вы правильно преобразовали строку java из sourceMap в строку javascript, однако в этом случае это не требуется.

Java строки совместно используют методы String.prototype, если их нет конфликт в имени метода. Сами строки Java имеют метод lastIndexOf, поэтому он вызывается в моем ответе. Строка java может без проблем заимствовать метод слайса из javascript. Метод javascript возвращает строку javascript.

Если по какой-то причине имя файла начинается с . и не содержит никаких других, это не оставит вас с пустым именем файла.

var filename = $('originalFilename');
var index = filename.lastIndexOf('.');
if (index > 0) filename = filename.slice(0, index);
logger.info('filename: ' + filename);

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

var originalFilename = new java.lang.String('2020049.259317052.HC.P.F3M147-G');
var _filename       = String(originalFilename);

Это дало мне правильное значение pos 22.

1 голос
/ 29 апреля 2020

Новый ответ

  1. После проверки и проверки того, что Агермано сказал, что он прав.
  2. В вашем примере кода вы устанавливаете pos = i, но регистрируете _pos
  3. Новый ответ var newFilename = _filename.slice(0, _filename.lastIndexOf('.'))

Предыдущий ответ

Сначала вы смешиваете JavaScript типов и Java типов.

var _filename       = String(sourceMap.get('originalFilename'));

Вместо этого do

var _filename       = '' + sourceMap.get('originalFilename');

Это приведет к преобразованию типа из Java String в JS string.

Во-вторых, есть более простой способ сделать то, что вы пытаетесь сделать.

var _filenameArr = ('' + sourceMap.get('originalFilename')).split('.');
_filenameArr.pop()                     // throw away last item
var _filename = _filenameArr.join('.') // rejoin the array with out the last item

logger.info('_filename:' + _filename)
...