【问题标题】:jQuery each arrayjQuery每个数组
【发布时间】:2012-01-07 06:42:20
【问题描述】:
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');,我就明白了! ^^

【问题讨论】:

  • 另外你不应该使用new Array(),而是[]
  • 控制台是否出现错误?似乎 a[x] 未定义,因此您尝试将属性“名称”分配给未定义的变量。
  • new Array() 根据 ECMAScript 语言规范及其实现完全没问题,但 [] 更短,它的 reduced compatibility 今天几乎不相关。

标签: jquery arrays multidimensional-array each


【解决方案1】:

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

注意:您的代码在each() 之后缺少;。尽管省略分号是有效的 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 列表中构建数据集合。

【讨论】:

  • 另外,x 是一个糟糕的数组索引名称,each() 方法已经将数组索引传递给您的函数,因此您无需为此维护自己的变量。但 Didier 是对的,map() 无论如何是更好的解决方案。
  • 我现在完全明白这太棒了!!
  • 正确的是:还没有对象具有属性name。顺便说一句,b 是不必要的。此外,这些语言是动态的,因此可以像 OP 一样使用属性访问器语法随时添加属性(只要对象允许)。在将返回值分配给 a 之前,您的 toArray(…) 没有任何用处。
  • 初始化a = []在这里毫无意义。这些语言是松散类型的。如果必须,请写var a = ….toArray();
【解决方案2】:

你忘了

a[x] = {};

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

a[x][p] = …;

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

【讨论】:

  • .each().map()应该明智地使用你不应该使用更正确。对于大型集合(1000+),使用纯 javascript 效率更高,否则,收益非常微不足道。
【解决方案3】:
a[x] = {name: 'f', link: 'UUUUUUUUUUU'};

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      这是我的解决方案:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-29
        • 2011-11-19
        • 2014-02-01
        • 2019-03-13
        • 1970-01-01
        • 2016-10-24
        • 2018-11-21
        • 2023-04-04
        相关资源
        最近更新 更多