$.each()与嵌套数组

3

首先,如果我没有正确识别数组类型,请原谅我,但我似乎无法解决这个问题。

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

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"
        }]};

当我点击一个按钮(比如标题),我不知道如何让它自动遍历数组。这是我的按钮代码:
```html ```
请注意,该数组是预先定义好的。
                $.each(myArray.songs, function(e,i){
                    console.log("e:"+e+" - i:"+i+" - "+myArray.songs[e].i);

                });

这确实可以工作,但当它到达console.log时,我得到的是:

e:0 - i:[object Object] - undefined

我不知道如何使“i”起作用,它总是给我[Object Object]。如果我用数组中实际的id替换I,它就可以正常工作。

谢谢。


这些数组非常奇怪。每个数组只有一个元素。 - tjb1982
1
你在这里尝试实现什么并不完全清楚。你能更具体地说明期望的输出吗? - Tharsan
@Tharsan,我只是想尝试显示歌曲对象中的所有内容。 - Anthony Honciano
@tjb1982,请解释一下为什么这很奇怪。我还在学习中,所以非常感谢你的信息。 - Anthony Honciano
5个回答

14

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

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

这个完全有效!谢谢大家的意见,我正在学习JSON,所以如果这让大家感到困惑或者使用不正确,我很抱歉。我没有收到任何错误提示,所以我认为它是正常的。 - Anthony Honciano

1
如果您想循环播放所有歌曲,myArray.songs 是一个包含一个对象的数组。
尝试这样做:
$.each(myArray.songs[0], function(e, i) {
  console.log('e:' + e + ' - i:' + i);
});

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


这对我也起作用了!你们太棒了,感谢你们的帮助! - Anthony Honciano

0

你的结构有点奇怪 - songs 是一个数组,其中包含一个单独的 JSON 元素,其中包含你的键值对。尽管如此,要循环遍历这些元素,你应该这样做:

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

0

除非你需要迭代一组jQuery元素,否则我不会使用$.each()(这是个人偏好)。相反,利用数组上的本地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);
            }
        });
    }
}

这个函数可以处理数组和对象实例,还支持递归。你可以通过始终使用Object.keys()来获取成员名称,但我认为即使在非常大的数据集上,它对性能的影响也是可以忽略不计的。


并非所有的浏览器都支持 .forEach,因此您可能需要修改数组原型才能像这样使用它:if (!('forEach' in Array.prototype)) Array.prototype.forEach = function() { ... }; 请参见 https://dev59.com/g13Va4cB1Zd3GeqPEdpI 以获取实现细节。 - tjb1982

0

我不完全确定你的数据是什么意思,但它看起来像一堆歌曲/艺术家/流派分组,彼此之间存在某些联系。例如:

[{"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.");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接