使用Javascript订购JSON

时间:2012-04-13 12:39:36

标签: javascript json sorting

考虑到我有以下JSON,我怎样才能生成另一个JSON,按字段排序(让我们说anoCobranca)?

{
  "extratos": [
    {
      "descricao":         "product A",
      "anoCobranca":       2012,
      "mesCobranca":       01,
      "nomeMesCobranca":   "Janeiro",
      "diaUsoInicial":     1,
      "diaUsoFinal":       30,
      "valor":             "236.81",
      "vencimento":        "24/01/2012",
      "formaPagamento":    "Cartão",
      "situacao": "ok"
    },
    {
      "descricao":         "product B",
      "anoCobranca":       2012,
      "mesCobranca":       2,
      "nomeMesCobranca":   "Fevereiro",
      "diaUsoInicial":     1,
      "diaUsoFinal":       29,
      "valor":             "249.81",
      "vencimento":        "24/02/2012",
      "formaPagamento":    "-",
      "situacao":          "aberto"
    },
    {
      "descricao":         "product 1",
      "anoCobranca":       2012,
      "mesCobranca":       3,
      "nomeMesCobranca":   "Março",
      "diaUsoInicial":     1,
      "diaUsoFinal":       31,
      "valor":             "339.11",
      "vencimento":        "24/03/2012",
      "formaPagamento":    "Cartão",
      "situacao":          "ok"
    },
    {
      "descricao":         "product D",
      "anoCobranca":       2011,
      "mesCobranca":       4,
      "nomeMesCobranca":   "Abril",
      "diaUsoInicial":     1,
      "diaUsoFinal":       30,
      "valor":             "119.18",
      "vencimento":        "24/04/2012",
      "formaPagamento":    "Cartão",
      "situacao":          "ok"
    },
    {
      "descricao":         "product E",
      "anoCobranca":       2011,
      "mesCobranca":       5,
      "nomeMesCobranca":   "Maio",
      "diaUsoInicial":     1,
      "diaUsoFinal":       30,
      "valor":             "81.29",
      "vencimento":        "24/05/2012",
      "formaPagamento":    "-",
      "situacao":          "aberto"
    }
  ]
}

我尝试了一些技巧,如:

function sortJSON(a,b){
  return parseInt(a.json.extratos.anoCobranca - b.json.extratos.anoCobranca)
}

我在StackOverflow找到的其他一些人,但他们都失败了。

3 个答案:

答案 0 :(得分:5)

使用回调函数对数组进行排序:

obj.extratos.sort(function(a, b) {
  return a.anoCobranca - b.anoCobranca;
});

答案 1 :(得分:1)

如果您不反对使用外部库,那么我建议使用Underscore.js来解决此问题和类似问题。以下是我在下面一行中执行此操作的示例:

var model = {
  "extratos": [
    {
      "descricao":         "product A",
      "anoCobranca":       2012,

            .
            .
            .

      "situacao":          "aberto"
    }
  ]
};

model.extratos = _.sortBy(model.extratos, 
                   function (extrato) { return extrato.anoCobranca; });

console.log(model);

这里有一个jsFiddle,你可以在那里玩:http://jsfiddle.net/JohnMunsch/4eE2F/

Yanick的解决方案也是一个很好的解决方案,但我认为Underscore库具有广泛的功能(例如,map和reduce),可以帮助您解决一组复杂的数据操作问题,这些问题超越了简单的排序。

答案 2 :(得分:1)

使用underscore即可:

_(obj.extratos).pluck(propertyName).sort()