【问题标题】:how to sort a json object?如何对json对象进行排序?
【发布时间】:2013-07-08 17:46:38
【问题描述】:

我有一个 json 对象。对象如下所示

{"route":[
{"match":"true","column":"10","fare":"500.0","source":"false","length":"1","name":"41","row":"4","width":"1","zIndex":"0"},
{"match":"true","column":"9","fare":"500.0","source":"false","length":"1","name":"37","row":"3","width":"1","zIndex":"0"},
{"match":"true","column":"8","fare":"500.0","source":"false","length":"1","name":"33","row":"2","width":"1","zIndex":"0"},
{"match":"true","column":"7","fare":"500.0","source":"false","length":"1","name":"29","row":"1","width":"1","zIndex":"0"}}
{"match":"true","column":"6","fare":"500.0","source":"false","length":"1","name":"29","row":"0","width":"1","zIndex":"0"}}

我想根据行和列按升序对该对象进行排序。就像我希望得到的对象如下所示

{"route":[
{"match":"true","column":"6","fare":"500.0","source":"false","length":"1","name":"41","row":"0","width":"1","zIndex":"0"},
{"match":"true","column":"7","fare":"500.0","source":"false","length":"1","name":"37","row":"1","width":"1","zIndex":"0"},
{"match":"true","column":"8","fare":"500.0","source":"false","length":"1","name":"33","row":"2","width":"1","zIndex":"0"},
{"match":"true","column":"9","fare":"500.0","source":"false","length":"1","name":"29","row":"3","width":"1","zIndex":"0"}}
{"match":"true","column":"10","fare":"500.0","source":"false","length":"1","name":"29","row":"4","width":"1","zIndex":"0"}}

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你看过这个stackoverflow.com/questions/4222690/…了吗?
  • 没有“json 对象”这样的东西。有json字符串。可以解码为原生对象。
  • 看看[].sort。传递一个函数来比较obj.route 数组中每个元素的column 值。文档中有一个对对象数组进行排序的示例。
  • @MarcB 你明白当 OP 说“json object”时,它似乎是一种有用的措辞。我讨厌有人说“我想对 json 进行排序”而你不知道他们的意思。

标签: jquery json


【解决方案1】:

给定提供的对象:

var obj = {
    "route" : [
        {"match":"true","column":"10","fare":"500.0","source":"false","length":"1","name":"41","row":"4","width":"1","zIndex":"0"},
        {"match":"true","column":"9","fare":"500.0","source":"false","length":"1","name":"37","row":"3","width":"1","zIndex":"0"},
        {"match":"true","column":"8","fare":"500.0","source":"false","length":"1","name":"33","row":"2","width":"1","zIndex":"0"},
        {"match":"true","column":"7","fare":"500.0","source":"false","length":"1","name":"29","row":"1","width":"1","zIndex":"0"},
        {"match":"true","column":"6","fare":"500.0","source":"false","length":"1","name":"29","row":"0","width":"1","zIndex":"0"}
    ]
};

你需要在数组上实现一个排序函数,如下所示:

如果列优先于行,则首先检查列的值。如果相等,则检查该行的值。

obj.route.sort(function(a, b) {
    if (a.column == b.column) {
        return a.row == b.row ? 0 : +a.row > +b.row ? 1 : -1;
    }

    return +a.column > +b.column ? 1 : -1;
});

如果行优先于列:

obj.route.sort(function(a, b) {
    if (a.row == b.row) {
        return a.column == b.column ? 0 : +a.column > +b.column ? 1 : -1;
    }

    return +a.row > +b.row ? 1 : -1;
});

FIDDLE DEMO

【讨论】:

  • @crush 您在引用之前放置的那些加号“+”的目的是什么? (例如+a.row+b.row)提前致谢。
  • @KiriSakow 它们是将值转换为数字的一元运算符(如果它最初是字符串)。
【解决方案2】:
var o = {"route":[
{"match":"true","column":"10","fare":"500.0","source":"false","length":"1","name":"41","row":"4","width":"1","zIndex":"0"},
{"match":"true","column":"9","fare":"500.0","source":"false","length":"1","name":"37","row":"3","width":"1","zIndex":"0"},
{"match":"true","column":"8","fare":"500.0","source":"false","length":"1","name":"33","row":"2","width":"1","zIndex":"0"},
{"match":"true","column":"7","fare":"500.0","source":"false","length":"1","name":"29","row":"1","width":"1","zIndex":"0"},
{"match":"true","column":"6","fare":"500.0","source":"false","length":"1","name":"29","row":"0","width":"1","zIndex":"0"}]};

var r = o.route;
// sort
var sorted = r.sort(function (a, b) {
    a = parseInt(a.column, 10);
    b = parseInt(b.column, 10);
    return a < b ? -1 : a > b ? 1 : 0;
});
console.log(sorted);

【讨论】:

  • 感谢这对我来说非常有用:)
猜你喜欢
  • 2017-06-07
  • 2018-02-13
  • 2014-09-27
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 2012-11-25
  • 1970-01-01
相关资源
最近更新 更多