【问题标题】:Sort JSON data object of objects by object value按对象值对对象的 JSON 数据对象进行排序
【发布时间】:2016-09-08 09:51:48
【问题描述】:

我从 mongoDB 获取数据并将其发送到客户端,返回的 JSON 结构如下:

{ "0" : { "_id" : { "$oid" : "57d129bfaa1a7567d9d" }, "id" : "155edc1698efc18e", "history_id" : "41752", "messages" : [ { "id" : "155edc1698efc18e", "snippet" : "Mari567567rnar | IT U756567ive travel experience T: +35667575756756| T: +7567560 F: +3567756792 | E: ad75675travel.com Ulix doo | Miramarsk765657 HR–105675 Zagreb ----------", "labels" : [ "INBOX", "IMPORTANT", "CATEGORY_PERSONAL", "Label_15", "Label_7" ], "date" : "1468572702000", "history_id" : "41752",

我使用var objects = JSON.parse(response);解析它

当我记录它时,它看起来像这样:

它基本上是对象的对象。它的作用类似于数组,但它不是数组,我不能使用数组方法,例如sort

这就是我的内在对象的样子。

{_id:object, history_id:string, id:string, messages:array}

我即将将 history_id 值转换为 int 并按该值对这些对象进行排序。

我正在寻找按该值对这些对象进行排序的最佳方法。我使用了.sort 方法,但它是数组方法,并且没有为对象类型定义。我会将主对象转换为数组并调用该方法。或者,如果有一种方法可以以更优雅的方式对这些对象进行排序,而无需将其转换为数组。哪种方法更实用,如何正确实施?

【问题讨论】:

  • 将您的对象转换为数组。对象没有顺序,无法排序,所以无论如何这是一个必要的步骤。
  • @deceze 你会推荐最实用的方法来将此对象转换为适当的可排序数组吗?
  • 为什么以对象开头?你能在服务器上改变一些东西给你一个普通的数组吗?
  • 如果它有一个长度属性,你可以使用Array.prototype.sort.call( objectName, function(a, b) { return a.history_id - b.history_id; } )或类似的东西

标签: javascript


【解决方案1】:

如果您愿意,您可以使用Object.keys( objects ),它将为您最初解析的对象中的所有键返回一个数组,然后您可以对其进行迭代并转换为一个数组

有点像这个例子

'use strict';
var fakeJson = '{ "0" : { "_id" : { "$oid" : "57d129bfaa1ab0795a42cd9d" }, "id" : "155edc1698efc18e", "history_id" : "41752", "messages" : [ { "id" : "155edc1698efc18e", "snippet" : "Marino Pernar | IT Ulix exclusive travel experience T: +385 1 640 6649 | T: +385 91 6410 930 F: +385 1 615 4092 | E: admin@ulixtravel.com Ulix doo | Miramarska cesta 26 | HR–10000 Zagreb ----------", "labels" : [ "INBOX", "IMPORTANT", "CATEGORY_PERSONAL", "Label_15", "Label_7" ], "date" : "1468572702000", "history_id" : "41752" } ] }, "1": { "_id" : { "$oid" : "57d129bfaa1ab0795a42cd9d" }, "id" : "155edc1698efc18e", "history_id" : "41750", "messages" : [ { "id" : "155edc1698efc18e", "snippet" : "Marino Pernar | IT Ulix exclusive travel experience T: +385 1 640 6649 | T: +385 91 6410 930 F: +385 1 615 4092 | E: admin@ulixtravel.com Ulix doo | Miramarska cesta 26 | HR–10000 Zagreb ----------", "labels" : [ "INBOX", "IMPORTANT", "CATEGORY_PERSONAL", "Label_15", "Label_7" ], "date" : "1468572702000", "history_id" : "41752" } ] } }';

var objects = JSON.parse(fakeJson);

console.log(objects);

var copy = [];

Object.keys(objects).forEach(function(key) {
  copy.push( objects[key] );
});

copy.sort(function(a, b) {
  return a.history_id - b.history_id;
});

console.log(copy);

顺便说一句,您确定要在此处分配个人信息(电子邮件地址、电话号码)吗?我希望它是虚拟信息。

【讨论】:

  • 感谢您的关注。现在是虚拟信息,但即便如此,所有这些数据都是公开的。
【解决方案2】:

正如 cmets 中所说,您必须使用数组来对元素进行排序。

您可以通过这种方式使用lodash 库做到这一点:

var arr = _.values(obj);

如果需要这里是lodash values function documentation

完成后,您可以使用 array.sort 方法使用 compareFunction 参数对数据进行排序,如您所见 here

【讨论】:

  • 我现在不想使用 lodash。
猜你喜欢
  • 2021-09-16
  • 2012-12-24
  • 1970-01-01
  • 2016-09-21
  • 2014-05-12
  • 2013-11-25
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多