javascript для построения многомерных массивов и объектов - PullRequest
0 голосов
/ 28 декабря 2011

Я пытаюсь построить массив / объект на основе пользовательского ввода в форму, которая имеет radio s, checkbox s с radio s, text с radio s и select s.Я хочу, чтобы окончательный массив / объект был объединен так, чтобы активированные элементы формы с повторяющимися именами были объединены в один объект:

data = {
    name0 = (value0,value4), // checkbox
    name1 = (value2), // radio
    name2 = (value5), // select>option
    name4 = (''), // non-response
    name5 = (NULL) // form element was disabled/hidden
}

Javascript выглядит довольно разборчиво, поэтому у меня возникли некоторые проблемы.Я разбил его на 3 части (Arr1, Arr2, Arr3), но похоже, что первый бит сохраняет только последний элемент формы, а второй бит останавливается для каждого имени после его обнаружения.

Кодв JSfiddle: http://jsfiddle.net/jshado1/5Y7sn/12/

EDIT : я хочу, чтобы конечный массив был похож на пример в скрипте: (со всеми не проверенными альфами, бета = 1 проверено, бета = 2 проверено, а дельта = 3 выбрано)

data : {
    { 'alpha'    : '' },
    { 'beta'     : '1','2' },
    { 'delta'    : '3' },
    { 'continue' : 'continue' }
}

(со временем я отфильтрую [продолжить], используя более точный селектор jQuery, и оставлю кнопку вне div)

Ответы [ 2 ]

4 голосов
/ 28 декабря 2011

Я не совсем уверен в вашей цели здесь, но я вижу некоторые проблемы с вашим кодом:

  1. У вас есть глобальная переменная I, которая инициализируется равной 0, но никогда не изменяется, поэтому, когда вы используете ее в качестве индекса для Arr1[I] внутри цикла .each(), вы будете непрерывно перезаписывать элемент массива 0.
  2. У вас есть Arr2[n] = +1;, когда вы, вероятно, имели в виду Arr2[n] += 1; или Arr2[n]++;
  3. Ваш цикл for использует необъявленный индекс i, хотя это должно сработать (просто i неявно глобален, и всегда лучше объявить все ваши переменные).
  4. В середине переключателя у вас есть Arr3[nom] += val;, но Arr3[nom] никогда не инициализируется равным 0, так эффективно вы говорите undefined += val, что даст NaN.
  5. В вашем выражении switch у вас есть case ("checkbox" || "radio"):, что эквивалентно case "checkbox", поэтому вы никогда не совпадете по "радио". Вы хотите, чтобы провал охватывал оба значения.

Обновите ваш переключатель:

switch(type) {
    case "checkbox":
        // fall-through
    case "radio":
        if (state) {
           if (Arr2[nom] > 1) {
               Arr3[nom] += val;
           } else {
               Arr3[nom] = val;
           }
        }
        break;
    case "text":
        Arr3[nom] = val;
        break;
    default:
        break;
}

Именно в этот момент я согласен с @Matmarbon и сдаюсь. Я бы посоветовал вам исправить все вышеперечисленное и вернуться к нам.

3 голосов
/ 28 декабря 2011

Ладно .. не знаю с чего начать ... сначала вы должны использовать : s вместо = s для определения свойств объектов. Во-вторых, действительно нет проблем с вложением объектов. Атрибут объекта может быть когда-либо другим объектом. Так что var x = { 'a' : { { 1 : {} } : 'the value' } } является верным определением.

Дополнительная информация, когда я понял вашу JSFiddle ^^

РЕДАКТИРОВАТЬ: Вот возможное решение, если я правильно понял ваш вопрос: http://jsfiddle.net/5Y7sn/8/

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