jQuery каждый массив - PullRequest
       36

jQuery каждый массив

2 голосов
/ 27 ноября 2011
analyse : function (that) {

        var a = new Array();
        var x = 0;

        $(that).children("li").each(function(){
            console.log('test1');
            a[x]['name'] = 'f'; 
            a[x]['link'] = 'UUUUUUUUUUU';
            console.log('test2');
            x++;
        })

        return a;
    }

Я пытаюсь создать массив для хранения иерархии из моего меню для PHP позже.

Консоль не покажет мне "test2", что я сделал не так?


Превращается в это с помощью Дидье Г:

analyse : function (that) {
        return $(that).children('li').map(function() {
            var b = {
                name: $(this).children('a').text(), 
                link: $(this).children('a').attr('href')
            };
            if ($(this).children('ul').size() > 0) {
               b.childs =  mcms.module.analyse($(this).children('ul'));
            } 
            return b;
        });
    }

Так что, если я скажу var y = analyse('#menu');, я получу целую кучу! ^^

Ответы [ 5 ]

9 голосов
/ 27 ноября 2011

'a[x]' на данный момент не определено.Вы должны сначала построить объект и назначить его позиции 'i' ('x' - действительно нестандартное имя для итератора, спасибо @Cito):

var a = new Array();
var i = 0;

$(that).children("li").each(function(){
        console.log('test1');
        a[i] = { name: 'f', link: 'UUUU' };
        console.log('test2');
        i++;
});

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


Создание массива может быть достигнуто с помощью .map ()

var a = [];

// .map() returns a jquery array, to obtain a pure javascript array, you must call .toArray() afterwards
a = $(that).children('li').map(function() {
    return { name: 'f', link: 'UUUU' };
}).toArray();

Вот jsfiddle , чтобы проиллюстрировать

Эта статья охватывает использование .each () и .map () дляпостроение коллекций данных из списков в jquery.

1 голос
/ 01 июня 2012

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

Вот мое решение:

$("li").each(function(i,e){
// Build Array
questionOb[i] = {
    'questionSeq' : i, 
    'questionType' : $(this).find(".questionType").attr("rel"), 
    'questionLabel' : $(this).find(".questionLabel").attr("rel"), 
    'questionAnswers' : $(this).find(".questionAnswers").attr("rel"), 
    'questionMinimum' : $(this).find(".questionMinimum").attr("rel"), 
    'questionMaximum' : $(this).find(".questionMaximum").attr("rel"), 
    'questionInterval' : $(this).find(".questionInterval").attr("rel"), 
};
});

var dataString = {
    questionsSet : questionOb
};

Это важно - создать массив вопросов для каждого "li".находит.В итоге данные выглядят примерно так:

Array
(
    [questions] => Array
        (
            [0] => Array
                (
                    [questionSeq] => 0
                    [questionType] => email
                    [questionLabel] => Please enter your question here.
                    [questionRandom] => no
                    [questionRequired] => no
                )

            [1] => Array
                (
                    [questionSeq] => 1
                    [questionType] => numeric
                    [questionLabel] => Please enter your question here.
                    [questionRandom] => no
                    [questionRequired] => no
                )

            [2] => Array
                (
                    [questionSeq] => 2
                    [questionType] => singleselect
                    [questionLabel] => Please enter your question here.
                    [questionAnswers] => 
                    [questionRandom] => no
                    [questionRequired] => no
                )

        )

)
1 голос
/ 27 ноября 2011

a пусто, вы пытаетесь установить свойства для неопределенного объекта.Вместо этого используйте этот код:

    var a = [];
    $(that).children("li").each(function(x){
        console.log('test1');
        a[x] = {};
        a[x].name = 'f'; 
        a[x].link = 'UUUUUUUUUUU';
        console.log('test2');
    })

    return a;

Еще короче будет этот код (внутри обратного вызова):

a[x] = {name: 'f', link: 'UUUUUUUUUUU'};
0 голосов
/ 27 ноября 2011
a[x] = {name: 'f', link: 'UUUUUUUUUUU'};
0 голосов
/ 27 ноября 2011

Вы забыли

a[x] = {};

, чтобы сделать элемент с индексом x (ссылка на) объектом, который может иметь свойства p, добавляемые с

a[x][p] = …;

Вы не должны использовать each(…), это очень неэффективно по сравнению с циклом for.

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