JavaScript JSON 数据分组

19

对不起,如果这个问题之前被问过,请原谅我,但是我找不到一个好的例子来完成我想要做的事情。也许我只是没有寻找正确的东西。如果有关于此的解释,请纠正我。无论如何...

我有这样结构的JSON数据...

{"Result":[
    {"Level":"ML","TeamName":"Team 1","League":"League 1"},
    {"Level":"ML","TeamName":"Team 2","League":"League 2"},
    {"Level":"ML","TeamName":"Team 3","League":"League 3"},
    {"Level":"3A","TeamName":"Team 4","League":"League 1"},
    {"Level":"3A","TeamName":"Team 5","League":"League 2"},
    {"Level":"3A","TeamName":"Team 6","League":"League 3"},
    {"Level":"2A","TeamName":"Team 7","League":"League 1"},
    {"Level":"2A","TeamName":"Team 8","League":"League 2"},
    {"Level":"2A","TeamName":"Team 9","League":"League 3"},
]}

我想要将它分组或重构为以下方式...

{"Result":[
    {"ML":[
        {"TeamName":"Team 1","League":"League 1"},
        {"TeamName":"Team 2","League":"League 2"},
        {"TeamName":"Team 3","League":"League 3"}
    ]},
    {"3A":[
        {"TeamName":"Team 4","League":"League 1"},
        {"TeamName":"Team 5","League":"League 2"},
        {"TeamName":"Team 6","League":"League 3"}
    ]},
    {"2A":[
        {"TeamName":"Team 7","League":"League 1"},
        {"TeamName":"Team 8","League":"League 2"},
        {"TeamName":"Team 9","League":"League 3"}
    ]}
]}

我该如何使用JavaScript/jQuery来实现这一点?不幸的是,我无法编辑服务器发送给我的内容。


8
你尝试过什么?(http://whathaveyoutried.com/)这是一个微不足道的问题... - Niet the Dark Absol
将JSON转换为对象,将相关部分复制到另一个对象中,然后将第二个对象转换为JSON。你能做到。 - Jonathan M
@JonathanM 最后一步甚至可能是不必要的,因为他们假定在某个时候会想要实际使用该对象。 - Anthony Grist
说实话,我还没有尝试过太多。我正在努力理解如何处理这个问题。我不知道是否需要使用循环和$.grep()的组合来解决这个问题。任何指导或帮助都将是非常好的。 - ksumarine
1个回答

28

只需在对象中跟踪所有内容:

let groups = Object.create(null);

data.forEach(item => {
    if (!groups[item.Level]) {
        groups[item.Level] = [];
    }

    groups[item.Level].push({
        TeamName: item.TeamName,
        League: item.League
    });
});

let result =
    Object.entries(groups)
        .map(([k, v]) => ({[k]: v}));

2
@TimothyAaron:不,JavaScript的for in循环遍历键而不是值,你不应该使用它来遍历数组。所以,我们仍在等待for each的广泛采用:D - Ry-
太好了...非常感谢您提供的一些想法。 - ksumarine
我理解了你给出的jQuery代码的第一部分,但是在var result = $.map这里我就不明白了,这只是另一种做法吗?如果是的话,我仍然不明白,但我认为我可以只使用var groups的第一部分。它似乎与第一部分没有任何关系,也不需要。所以我希望它只是一种替代方案。 - redfox05
@Russell:根据问题,最终结果是一个数组,这是获取该数组的唯一方法,但我错误地将“data”传递给了“map”,而不是“groups”。 - Ry-
另一种我经常使用的遍历对象的方式是这样的: Object.keys(groups).forEach(function(key, index) { //*code here* });. 我发现它比使用 call 更干净。 - inolasco
显示剩余3条评论

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