按日期排序多维对象

时间:2017-03-10 17:28:20

标签: jquery json sorting object

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

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

我所有日期都在:Multi_Obj ["值"] ["日期"];

如果我使用命令sort:

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不是函数。

请帮助我! :)

2 个答案:

答案 0 :(得分:0)

由于它们是如何在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];
}

答案 1 :(得分:0)

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')