【问题标题】:$.each() with nested array$.each() 与嵌套数组
【发布时间】:2013-03-15 17:01:11
【问题描述】:

首先,如果我没有确定正确的数组类型,请原谅我,但我似乎无法弄清楚这一点。

我正在尝试在查询中运行这个数组:

var myArray = {"artists":[{
            "a1":"Adam Sandler",
            "a2":"Adam Lambert",
            "a3":"Avril Levine",
            "a4":"Backstreet Boys",
            "a5":"Blackstreet",
            "a6":"Black Eye Peas",
            "a7":"Cool and the Gang",
            "a8":"Chicago",
            "a9":"Charlie Manson"

        }],
        "songs":[{
            "s1":"Grow Old With You",
            "s2":"Whatdaya Want From Me",
            "s3":"Yea yea",
            "s4":"Quit Playing Games With My Heart",
            "s5":"No Digity",
            "s6":"Meet Me Half way",
            "s7":"Doo wa ditty",
            "s8":"Fight for your honor",
            "s9":"Charlies Song"
        }],
        "genre":[{
            "g1":"Pop",
            "g2":"Pop",
            "g3":"Alternative",
            "g4":"R & B",
            "g5":"R & B",
            "g6":"Hip-Hop",
            "g7":"Funk",
            "g8":"Soft Rock",
            "g9":"Rock"
        }]};

当我点击一个按钮(比如标题)时,我不知道如何让它自动通过数组。这就是我的按钮:

                $.each(myArray.songs, function(e,i){
                    console.log("e:"+e+" - i:"+i+" - "+myArray.songs[e].i);

                });

这确实有效,但是当它到达 console.log 时,这就是我得到的:

e:0 - i:[object Object] - 未定义

我不知道如何让“i”工作,它总是给我 [Object Object]。我将 I 替换为数组中的实际 id,它可以工作。

谢谢。

【问题讨论】:

  • 这些数组很奇怪。每个人只有一项
  • 您在这里要完成的工作并不完全清楚。您能否更具体地了解预期输出?
  • @Tharsan,我只是想显示歌曲对象中的所有内容。
  • @tjb1982,请解释为什么这很奇怪。我还在学习这个,所以非常感谢你的信息。

标签: jquery json each


【解决方案1】:

如果你想使用$.each,你可以试试这个:-

$.each(myArray.songs, function (i, ob) {
    $.each(ob, function (ind, obj) {
        console.log("key:" + ind + " value:" + obj);
    });
});

【讨论】:

  • 这完全有效!谢谢大家的意见,我只是在学习 JSON,所以如果这让大家感到困惑或使用不当,我深表歉意。我没有被抛出错误,所以我认为这很好。
【解决方案2】:

我不完全确定您的数据意味着什么,但它看起来像是一堆歌曲/艺术​​家/流派组合在一起。例如,

[{"song":"Losing My Religion",
  "artist":"R.E.M.",
  "genre":"alternative"},
 {"song":"Bizarre Love Triangle",
  "artist":"New Order",
  "genre":"electronica"}]

我不确定为什么 s1、a1 或 g1 有用,所以我将它们排除在外。然后老实说,我认为为此使用 jquery 并没有帮助。我会这样做:

for (var i = 0; i < myArray.length; i++)
  console.log(myArray[i].song + " by " + myArray[i].artist + " is of the " + myArray[i].genre + " ilk.");

【讨论】:

    【解决方案3】:

    除非您需要迭代 jQuery 元素的集合,否则我不会使用 $.each() (这是个人喜好)。相反,利用 Array 上的原生 forEach() 方法:

    function each(obj, onSuccess, recursive) {
        if (obj && (typeof obj === 'object' || typeof obj === 'array')) {
            Object.keys(obj).forEach(function(key) {
                var val = obj[key];
                if (onSuccess && val && key) {
                    var quit = onSuccess(val, key);
                    if (false === quit) {
                        return false;
                    }
                }
                if (true === recursive) {
                    each(val, onSuccess, true);
                }
            });
        }
    }
    

    这处理 Array 和 Object 实例以及递归。您使用slight performance hit by always using Object.keys() 来获取成员名称,但我认为即使在非常大的数据集上它最终也可以忽略不计。

    【讨论】:

    • 并非所有浏览器都支持 .forEach,因此您可能必须修改数组原型才能像这样使用它:if (!('forEach' in Array.prototype)) Array.prototype.forEach = function() { ... }; 请参阅stackoverflow.com/questions/8348569/… 了解实现细节
    【解决方案4】:

    如果您尝试循环播放所有歌曲,myArray.songs 是一个包含一个对象的数组。

    试试这个:

    $.each(myArray.songs[0], function(e, i) {
      console.log('e:' + e + ' - i:' + i);
    });
    

    看看这个 jsFiddle http://jsfiddle.net/TsJP5/1/

    【讨论】:

    • 这也对我有用!!你们的帮助真是太棒了!
    【解决方案5】:

    您的结构有点奇怪 - 歌曲是一个数组,其中包含一个包含键值对的 json 元素。尽管如此,要遍历这些元素,您应该这样做:

        var songsElement = myArray.songs[0];
        for (var key in songsElement) {
            if (songsElement.hasOwnProperty(key)) {
                console.log(key + " -> " + songsElement[key]);
            }
         }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-19
      • 2012-08-15
      • 1970-01-01
      • 2011-09-04
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多