jQuery每个数组

时间:2011-11-27 11:11:36

标签: jquery arrays multidimensional-array each

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”,我做错了什么?


使用Didier G的帮助转换成这个:

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 个答案:

答案 0 :(得分:9)

那时

'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来说明

这个article涵盖了使用.each()和.map()从jquery中的列表构建数据集合。

答案 1 :(得分:1)

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'};

答案 2 :(得分:1)

<强>解: 我有类似的情况,并能够提出一个干净的解决方案。我基本上有一个问题对象,其中包含几个带有各个属性的问题。

这是我的解决方案:

$("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
                )

        )

)

答案 3 :(得分:0)

你忘记了

a[x] = {};

使索引x(引用)的元素成为可以添加属性p的对象

a[x][p] = …;

您不应该使用each(…),与for循环相比效率非常低。

答案 4 :(得分:0)

a[x] = {name: 'f', link: 'UUUUUUUUUUU'};