Массив .indexOf возвращает -1, несмотря на совпадение

Я пишу гибкий алгоритм поиска для части моего файла XML. У меня точно такой же метод работает безупречно в другом месте, поэтому это сводит меня с ума.

Вот раздел моей функции, с которым у меня проблемы.

var searchResults:Array = [];
var r:Array = [];

//Other code...

var classSplit:Array = inClass.split("-");
var profs:Array = getCourseProfs(classSplit[0], classSplit[1]);
trace(searchResults + "-vs-" + profs);

for each(var si:String in searchResults)
{
    trace(si + " is at index " + profs.indexOf(si));
    trace(profs);
    if(r.indexOf(si) == -1 && profs.indexOf(si) != -1)
    {
        r.push(si);
        trace(r);
    }
}

А вот вывод для операторов трассировки конкретного запуска (из приведенного выше кода).

GABIOMA1,GABIOMA1-vs-GABIOMA1,MITCHKA1,GIBSOCA1
GABIOMA1 is at index -1
GABIOMA1,MITCHKA1,GIBSOCA1
GABIOMA1 is at index -1
GABIOMA1,MITCHKA1,GIBSOCA1
Final: 

Как видите, функция имеет два результата в массиве searchResults (строки). Они оба идентичны, так как я еще не разобрался с повторяющимися результатами поиска. "ГАБИОМА1,ГАБИОМА1"

Затем я сравниваю это с массивом «profs» с этими тремя значениями: «ГАБИОМА1, МИТЧКА1, ГИБСОКА1».

Вы можете увидеть результат сопоставления в индексе 0 profs. Однако, как видно из следующей строки, profs.indexOf(si)' whensi` is "GABIOMA1" неправильно возвращает "-1".

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

РЕДАКТИРОВАТЬ: еще более бесит, что код в другой ветке оператора IF из этого работает как шарм...

for each(var s:String in searchResults)
{
    if(r.indexOf(s) == -1)
    {
        r.push(s);
    }
}

РЕДАКТИРОВАТЬ 2: Это мой РАБОЧИЙ обходной путь. Как видите, все массивы работают правильно.

for each(var si:String in searchResults)
{
    var match:Boolean = false;
    for each(var pi:String in profs)
    {
        if(si == pi)
        {
            pr.push(si);
            break;
        }
    }
}

person CodeMouse92    schedule 14.05.2014    source источник
comment
match == true; должно быть match=true; (edit2: строка 8)   -  person null.point3r    schedule 14.05.2014
comment
Хм, спасибо, что поймал это. (Проголосуйте за комментарий.) [Для тех, кто читает, это еще не ответ на вопрос.]   -  person CodeMouse92    schedule 14.05.2014
comment
Обновил мой обходной код еще раз для повышения эффективности. Вопрос остается прежним.   -  person CodeMouse92    schedule 19.05.2014


Ответы (1)


Поскольку ваш trace(profs) возвращает одну строку, ваш массив содержит строку GABIOMA1,MITCHKA1,GIBSOCA1 как единую сущность, поэтому ваш индекс GABIOMA1 возвращает -1. Вам нужно разделить запятую внутри getCourseProfs(), чтобы получить GABIOMA1 в виде отдельной строки.

ОБНОВЛЕНИЕ: я тестировал следующее:

    var t:Array = ['GABIOMA1', 'MISCHKA1', 'GIBSOCA1'];
    trace(t);
    trace(t.indexOf('GABIOMA1'));
    var a:Array = ['MITCHKA1', 'GABIOMA1\x00'];
    for each(var si:String in a) trace(si, 'is at index', t.indexOf(si));

Это дало мне ожидаемый результат -1 для любого элемента a и ожидаемые результаты трассировки, как в вашем примере, однако проверка на равенство не удалась. Пожалуйста, попробуйте обрезать строки searchResults перед проверкой indexOf().

Примечание: размещение \x00 в качестве первого символа строки дает разные результаты для трассировки! trace(si, 'is at index', t.indexOf(si)); приводит к отображению пустой строки вместо si следующим образом: is at index -1, а trace(si + ' is at index ' + t.indexOf(si)); приводит к отображению полной строки: GABIOMA1 is at index -1. Поэтому внимательно проверьте любую строку на наличие непечатаемых символов, вероятно, есть какой-то скрытый нулевой символ, который закручивает indexOf().

person Vesper    schedule 14.05.2014
comment
Нет, у профи несколько записей. Trace возвращает такие массивы. - person CodeMouse92; 14.05.2014
comment
Мой текущий рабочий код находится в EDIT 2. Как видите, поскольку это работает, profs, безусловно, является правильным массивом, а не просто строкой, как вы предложили. - person CodeMouse92; 14.05.2014