【问题标题】:Iterate json object array and sort it based on key with Protoype JS [duplicate]使用Protoype JS迭代json对象数组并根据键对其进行排序[重复]
【发布时间】:2014-12-02 08:05:12
【问题描述】:

对不起,如果这个问题是重复的,但我必须问它。我正在使用原型 JS 从文件中读取 JSON 数据。 JSON 数据如下所示;

{
    "metaData": {
        "date": "2014-10-06"
    },
    "listOf": [
        {
            "fname": "bill",
            "id": 23
        },
        {
            "fname": "tom",
            "id": 35
        },
        {
            "fname": "jerry",
            "id": 12
        },
        {
            "fname": "batman",
            "id": 68
        },
        {
            "fname": "superman",
            "id": 55
        },
        {
            "fname": "sp-m/super",
            "id": 55
        },
    ]
}

在我的代码中,我需要访问“listOf”键/数组,然后我想遍历每个元素并根据“fname”键对这些元素进行排序。我正在通过 ajax 请求读取这些数据。以下是该代码;

new Ajax.Request('/file.json', {
                    method:'get',
                    onSuccess: function(transport){
                        var json = transport.responseText.evalJSON();
                        console.log(json);
                    }
                });

现在 VAR JSON 包含所需数据,但我不知道如何访问“listOf”数据并对其进行迭代。

我尝试像这样使用 .each 函数;

json.list.each(alert);

但它只打印“object OBJECT”。

请帮我解决这个问题。

P.S:请尝试使用原型 JS 来回答,但不要使用 Jquery。

【问题讨论】:

  • 假设您实际使用了json.listOf.each(alert),那么这就是预期的结果 - 与例如相同的结果alert({ "fname": "bill", "id": 23 }) 会的。

标签: javascript arrays json prototypejs


【解决方案1】:

您可以使用其名称访问listOf 集合属性:

json.listOf

因此,如果您想对数组进行排序,可以尝试使用 .sort() javascript 方法:

json.listOf.sort(function(a, b) {
    if (a.fname > b.fname) {
        return 1;
    } else if (a.fname < b.fname) {
        return -1;
    }
    return 0;
});

// At this stage json.listOf will contain the sorted in-place array using the `fname` property

这里有一个sample jsfiddle 来说明这一点。

【讨论】:

  • 感谢您的回复。我刚刚用一个额外的值编辑了“listOf”属性。因为排序不正确地对元素/列表进行排序。它将“sp-m/super”放在“superman”之前。知道如何解决这个问题吗?你可以试试这个你的jsfiddle代码。
  • 为什么sp-msuper 按字母顺序排列在superman 之前,您会感到惊讶吗?这就是字母排序的工作原理。如果您想执行一些自定义排序,请随时更新传递给 .sort() 方法的匿名函数以满足您的自定义需求。
  • :) 我并不感到惊讶,但并不完全理解排序。无论如何,你至少能让我朝着正确的方向前进,我怎么能把像“超人”这样的词放在“sp-m/super”之前。一些提示就足够了。
  • 你想按字母倒序排列吗?然后只需更改if 条件。如果不是,请指定您想要排序的确切规则是什么。在不了解确切规则的情况下,您不太可能实施它们。
  • 您在演示中显示的内容是正确的。唯一的问题是“listOf”属性可以包含“superman”、“sv-m/ratio”等值。并且排序中的“sv-m”应该在“superman”之后,所以我想将它(“sv-m/ratio”)放在列表​​的末尾。解释可能看起来不完整或令人困惑,但这就是我所知道的。
猜你喜欢
  • 2018-02-02
  • 2021-10-14
  • 2018-11-14
  • 1970-01-01
  • 2020-05-03
  • 2017-06-02
  • 1970-01-01
  • 2014-05-29
  • 2017-09-29
相关资源
最近更新 更多