我有一个像这样的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不是函数。
请帮助我! :)
答案 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')