【问题标题】:Order by date multidimensional object按日期排序多维对象
【发布时间】:2017-08-01 03:34:30
【问题描述】:

我有一个像这样的 Json 对象:

"value": {
    "date": {
        "2017-03-10": {
            "0": {
                "buy": 0,
                "sell": 0
            },
            "1": {
                "buy": 0,
                "sell": 0
            },
            "2": {
                "buy": 0,
                "sell": 0
            },
        },
    },}

我的所有日​​期都在:Multi_Obj["value"]["date"];

如果我使用命令排序:

Multi_Obj["value"]["date"].sort(function(a, b) {
a = new Date(a.dateModified);
b = new Date(b.dateModified);
return a>b ? -1 : a<b ? 1 : 0;});

我有这个结果:

未捕获的 TypeError:Multi_Obj.show_data.sort 不是函数。

请帮助我! :)

【问题讨论】:

  • 排序可以用于数组而不是对象
  • Multi_Obj.value.date.sort(function(a, b) {
  • 对象的键不能排序。您在这里尝试做的事情是不可能的
  • 注意:这与 JSON 无关。请阅读json 标签上的使用信息。

标签: jquery json sorting object


【解决方案1】:

您无法对关联的数组进行排序,因为它们是在 JavaScript 中构建的,但如果将其转换为元组,则可以对其进行排序。所以,如果你曾经有:

colorPreference = {"favorate":"blue","hate","red"}

元组版本是:

colorPreference = [["favorate","blue"],["hate","red"]]

您仍然拥有键和值,但现在它采用基于数组的格式,确实强制执行顺序。关联数组强制其元素的顺序。

那么,我们的 JavaScript 是什么样子的:

function toTuples(assocArray) {
    var tuples = [];
    for (var key in assocArray) tuples.push([key, assocArray[key]]);
    return tuples;
}

console.log(toTuples(Multi_Obj["value"]["date"]).sort(function(a, b) {
    a = new Date(a[0]);
    b = new Date(b[0]);
    return a>b ? -1 : a<b ? 1 : 0;
}));

如果您想知道,您不能真正将其转换回来,因为这样就不会保留订单。但是你仍然可以循环遍历它:

for (var i = 0, len = output.length; i < len; i++) {
    key = output[i][0];
    value = output[i][1];
}

【讨论】:

    【解决方案2】:

    should not rely on a certain order 的对象属性,尽管一些较新的 ES6 方法会保证一定的顺序,但不能通过调用 sort 任意设置。

    您可以改为创建一个 ES6 Map,它的行为很像一个普通对象,但保留了 插入 顺序。您可以按如下方式使用:

    const obj = {
        "value": {
            "date": {
                "2017-12-01": "a",
                "2017-03-10": "b",
                "2017-05-20": "c",
                "2016-01-01": "d"
            }
        }
    };
    
    // Convert date property to a sorted Map:
    obj.value.date = Object.keys(obj.value.date)
        .sort( (a, b) => Date.parse(a) - Date.parse(b) )
        .reduce( (mp, a) => mp.set(a, obj.value.date[a]), new Map );
    
    // Display results (sorted):
    obj.value.date.forEach( (value, date) => console.log(date, value) );

    请注意,与 Map 一起使用的语法有点不同。要获得一个特定条目,您可以使用get 方法:

    obj.value.date.get('2017-03-10')
    

    【讨论】:

      猜你喜欢
      • 2018-03-07
      • 2016-10-31
      • 2013-11-30
      • 1970-01-01
      • 2019-07-05
      • 1970-01-01
      • 2018-09-25
      相关资源
      最近更新 更多