【问题标题】:sort json object in javascript在javascript中对json对象进行排序
【发布时间】:2013-07-15 03:05:05
【问题描述】:

例如有这个代码:

var json = {
    "user1" : {
        "id" : 3
    },
    "user2" : {
        "id" : 6
    },
    "user3" : {
        "id" : 1
    }
}

我怎样才能把这个json排序成这样-

var json = {
    "user3" : {
        "id" : 1
    },
    "user1" : {
        "id" : 3
    },
    "user2" : {
        "id" : 6
    }
}

我用 ID 对用户进行了排序..
我不知道如何在 javascript 中执行此操作..

【问题讨论】:

  • Sorting JavaScript Object by property value 完全相同。请注意,您无法对它们进行排序;对象是无序的键值映射。
  • 这对我没有帮助..我有不同的 json..由于某种原因,那里的答案在我的 json 上不起作用..
  • 当然你需要适应它……你明白它是如何工作的吗?如果是这样,并且您在调整它时遇到问题,请发布您的尝试。
  • 将 JSON 转换为数组,对数组进行排序,然后再转换回 JSON。应该可以,但如果你想这样做,也许你不需要使用 JSON。
  • @SharkofMirkwood:不涉及 JSON,他有简单的对象文字。并且将其转换回对象将使排序无效,因此这样做没有意义。

标签: javascript json sorting


【解决方案1】:

首先,那是 不是 JSON。它是一个 JavaScript 对象字面量。 JSON 是数据的字符串表示,恰好与 JavaScript 语法非常相似。

第二,你有一个对象。它们是未分类的。无法保证元素的顺序。如果你想要保证顺序,你需要使用一个数组。这将需要您更改数据结构。

一种选择可能是让您的数据看起来像这样:

var json = [{
    "name": "user1",
    "id": 3
}, {
    "name": "user2",
    "id": 6
}, {
    "name": "user3",
    "id": 1
}];

现在你有一个对象数组,我们可以对其进行排序。

json.sort(function(a, b){
    return a.id - b.id;
});

生成的数组将如下所示:

[{
    "name": "user3",
    "id" : 1
}, {
    "name": "user1",
    "id" : 3
}, {
    "name": "user2",
    "id" : 6
}];

【讨论】:

  • 优秀的答案和相反的顺序:return b.id - a.id;
【解决方案2】:

这是一个简单的 sn-p,它对 Json 的 javascript 表示进行排序。

function isObject(v) {
    return '[object Object]' === Object.prototype.toString.call(v);
};

JSON.sort = function(o) {
if (Array.isArray(o)) {
        return o.sort().map(JSON.sort);
    } else if (isObject(o)) {
        return Object
            .keys(o)
        .sort()
            .reduce(function(a, k) {
                a[k] = JSON.sort(o[k]);

                return a;
            }, {});
    }

    return o;
}

可以这样使用:

JSON.sort({
    c: {
        c3: null,
        c1: undefined,
        c2: [3, 2, 1, 0],
    },
    a: 0,
    b: 'Fun'
});

这将输出:

{
  a: 0,
  b: 'Fun',
  c: {
    c2: [3, 2, 1, 0],
    c3: null
  }
}

【讨论】:

  • 虽然这很有趣,但它并没有直接解决提出的问题。
【解决方案3】:

在某些方面,您的问题似乎很合理,但我仍可能将其标记为XY problem。我猜最终结果是你想以某种方式显示排序值?正如 Bergi 在 cmets 中所说,您永远不能完全依赖 Javascript 对象 ({i_am: "an_object"}) 以任何特定顺序显示它们的属性。

对于显示顺序,我可能建议您获取对象的每个键(即i_am)并将它们排序为有序数组。然后,在检索要显示的对象的元素时使用该数组。伪代码:

var keys = [...]
var sortedKeys = [...]
for (var i = 0; i < sortedKeys.length; i++) {
  var key = sortedKeys[i];
  addObjectToTable(json[key]);
}

【讨论】:

    【解决方案4】:
    if(JSON.stringify(Object.keys(pcOrGroup).sort()) === JSON.stringify(Object.keys(orGroup)).sort())
    {
        return true;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-12
      • 2021-12-14
      • 2018-03-18
      • 2021-06-21
      • 2017-06-07
      • 2018-02-13
      • 1970-01-01
      • 2020-03-06
      相关资源
      最近更新 更多