Как ссылаться на массив в аргументе функции - PullRequest
0 голосов
/ 20 декабря 2011

У меня есть ряд массивов, которые содержат слова, которые я хочу использовать в качестве текста в различных HTML-элементах (их около 35, для краткости я включил только несколько).

var bodyplan = ['Anguilliform', 'Compressiform', 'Depressiform', 'Filiform', 'Fusiform', 'Globiform', 'Sagittiform', 'Taeniform'];

var mouthposition = ["Inferior", "Jawless", "Subterminal", "Superior", "Terminal"];

var barbels = ['1', '2', '4 or more'];

var caudalshape = ['Continuous', 'Emarginate', 'Forked', 'Lunate', 'Rounded', 'Truncate'];

У меня есть функция переключения, которая должна изменять текст в зависимости от выбора пользователя:

switch(n){
            case 1:
            changelabels(bodyplan, 8);
            break;
            case 2:
            changelabels(mouthposition, 5);
            break;
            case 3:
            changelabels(barbels, 3);
            break;
            case 4:
            changelabels(caudalshape, 6);
            break;
            case 5:
            changelabels(dorsalspines, 8);
            break;
            default:
            alert("handquestsel error")}};

Наконец, у меня есть функция, в которую я хотел бы внести изменения (кроме случаев, когда это не так):

function changelabels(opt1,opt2){
    var i = opt2;
    var im = opt2 - 1;
    var c = 1;
    var index = 0;
    while (i>=c){   
        var oldlbl = document.getElementById("rb" + c + "lbl");
        var newlbla = opt1.slice(im,i);
        var newlblb = opt1.toString();
        oldlbl.innerHTML = newlblb; 
        c = c + 1
        index = index + 1
}};

Я знаю, что код для моей функции в данный момент просто неверен, но я изменял его так много раз, что не уверен, что происходит дальше. В какой-то момент у меня была функция, способная изменить текст, но она сделала это неправильно (она анализировала имя массива, а не извлекала значение из массива, как мне хотелось). Пожалуйста помоги. Я знаю, что пропускаю некоторые фундаментальные понятия здесь, но не уверен, какие из них. Я потерял счет часам, которые потратил, пытаясь понять это. Кажется, что это должно быть так просто, но во всех моих хаотических попытках заставить его работать, я все еще не наткнулся на ответ.

РЕДАКТИРОВАТЬ: я хочу, чтобы мой оператор switch вызывал функцию и передавал ей функцию, соответствующий массив для извлечения меток. Цель приложения - помочь пользователю научиться распознавать рыбу. Когда пользователь делает выбор на странице, будет показана серия изображений для различных состояний символов с сопровождающей меткой, описывающей это состояние. Например, когда пользователь выбирает Положение рта , серия делителей покажет различные положения рта, которые есть у рыбы, и будет иметь метку под изображением, чтобы сообщить пользователю, как называется это определенное состояние персонажа. Я могу заставить картинки меняться просто отлично, но у меня чертовски много времени с ярлыками.

Ответы [ 4 ]

1 голос
/ 20 декабря 2011

Почему бы не просто что-то вроде:

document.getElementById("bodyplan_label").innerHTML = bodyplan[bodyplan_index];

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

Также bodyplan имеет только 8 элементов, поэтому bodyplan[8] даст вам out of bounds exception, потому что массивы начинаются с 0, как это принято во всех современных языках программирования.

0 голосов
/ 20 декабря 2011

РЕШЕНИЕ: изменили область видимости переменных массива на локальные, переместив их в функцию, в которой они используются, вместо того, чтобы использовать их в качестве глобальных переменных в верхней части страницы. Я не понимаю, поскольку я следовал каждому правилу объявления переменных. Но по неизвестной причине глобальные переменные в javascript отвратительны.

Solution Edit: обнаружена ошибка в объявлении моих глобальных переменных. Это могло быть источником моей проблемы, почему я не мог получить к ним доступ. Но на данный момент это не проблема, так как я исправил свой код.

0 голосов
/ 20 декабря 2011

Если я правильно читаю ваши требования и код, в вашем выражении switch вы передаете и ссылку на соответствующий массив, и ожидаемую длину этого массива - вам не нужен второй параметр, потому что все массивы JavaScript имеют .length свойство .

Вы не хотите использовать .slice(), чтобы получить отдельные значения из массива, потому что это возвращает новый массив, скопированный из оригинала - просто используйте arrayVariable[index] чтобы получить отдельный элемент на index.

Итак, собрав его, попробуйте что-то вроде этого (с вашими существующими определениями массивов):

switch(n){
   case 1:
      changelabels(bodyplan);
      break;
   case 2: 
      changelabels(mouthposition);
   // etc.
}

function changelabels(data) {
   var i,
       lbl;

   for (i = 0; i < data.length; i++) {
      lbl = document.getElementById("rb" + (i+1) + "lbl");
      lbl.innerHTML = data[i];
   }
}

Обратите внимание, насколько это прощечем твой код?Я предполагаю, что элементы, которые вы обновляете, имеют идентификатор в формате «rb1lbl», «rb2lbl» и т. Д., Нумерация начинается с 1: я получаю эти идентификаторы, используя (i + 1), потому что индексы массива JavaScript начинаются снуль.Также обратите внимание, что вам даже не нужна переменная lbl: вы могли бы просто сказать document.getElementById("rb" + (i+1) + "lbl").innerHTML = data[i] - однако я оставил ее, чтобы у нас было что расширить ниже ...

Внутри вашегоВы, похоже, изменяете метки на наборе элементов (метки переключателей?), по одному на значение в массиве, но вы останавливаетесь, когда у вас заканчиваются элементы массива, что означает, что любые оставшиеся элементы будут по-прежнему содержать значения из предыдущеговыбор (например, если предыдущий выбор был «bodyplan» с 8 вариантами, и вы изменили на «положение рта» только с 5 - вам, вероятно, следует скрыть 3 оставшихся элемента, которые в противном случае продолжали бы отображать последние несколько элементов «bodyplan». В одну сторонусделать это вместо того, чтобы настраивать ваш цикл на основе длины массива, вы можете зациклить элементы, и если текущий элемент имеет индекс за концом массива, скрыть его, что-то вроде этого:

function changelabels(data) {
   var i,
       lbl,
       elementCount = 20; // or whatever your element count is

   for (i = 0; i < elementCount; i++) {
      lbl = document.getElementById("rb" + (i+1) + "lbl");
      if (i < data.length) {
         lbl.innerHTML = data[i];
         lbl.style.display = "";
      } else {
         lbl.innerHTML = "";
         lbl.style.display = "none";
      }
   }
}

Если эти элементы являются метками для переключателей (просто предположение, основанное на идентификаторах), то вы также хотели бы скрытьили покажите соответствующие переключатели, но я надеюсь, что вы можете выяснить, как добавить пару строк к вышеупомянутому, чтобы сделать это.

(Как уже упоминалось выше, будьте осторожны, когда число идентификаторов элементов увеличивается с 1, когдаиндексы массива начинаются с 0.)

Если вышеупомянутое не работает, пожалуйста, опубликуйте (хотя бы некоторые) соответствующий HTML - очевидно, я просто должен был догадаться, на что это может быть похоже.

0 голосов
/ 20 декабря 2011

Я не понимаю, чего именно вы пытаетесь достичь с помощью своего кода.Но чтобы передать переменную (в данном случае массив) по ссылке, нужно просто добавить «&» перед переменной.

function the_name(&$var_by_ref, $var_by_value) {
// Here if you modify $var_by_ref this will change the variable passed to the function.
}

Подробнее: http://php.net/manual/en/language.references.pass.php

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...