Mat*_*ent 3 javascript sorting
我目前正在尝试对对象进行排序,尽管我遇到了data.sort is not a function错误。
我从以下 StackOverflow 答案中获得灵感:通过单击标题标签对表格进行排序,无论它是数字、字母或日期。
我还浏览了其他问题,但尚未设法解决我的问题,因为它往往会导致其他问题,例如值是undefined.
这是我的对象:
{
"2010-01": {
"item1": 324,
"item2": 1075,
"item3": 940,
"item4": 441,
"item5": 1040,
"item6": 898,
"item7": 1343
},
"2011-02": {
"item1": 295,
"item2": 958,
"item3": 904,
"item4": 434,
"item5": 1038,
"item6": 793,
"item7": 1246
},
"2012-03": {
"item1": 314,
"item2": 1062,
"item3": 980,
"item4": 494,
"item5": 1158,
"item6": 914,
"item7": 1461
},
"2008-04": {
"item1": 336,
"item2": 1022,
"item3": 987,
"item4": 488,
"item5": 1014,
"item6": 792,
"item7": 1382
},
"2007-05": {
"item1": 332,
"item2": 1073,
"item3": 1002,
"item4": 512,
"item5": 1104,
"item6": 840,
"item7": 1368
},
"2005-06": {
"item1": 311,
"item2": 981,
"item3": 837,
"item4": 432,
"item5": 1002,
"item6": 801,
"item7": 1265
},
"2014-07": {
"item1": 321,
"item2": 1049,
"item3": 921,
"item4": 489,
"item5": 963,
"item6": 881,
"item7": 1340
},
"2015-08": {
"item1": 294,
"item2": 1071,
"item3": 960,
"item4": 506,
"item5": 910,
"item6": 885,
"item7": 1312
},
"2016-09": {
"item1": 281,
"item2": 1020,
"item3": 952,
"item4": 502,
"item5": 1068,
"item6": 914,
"item7": 1397
},
"2009-10": {
"item1": 319,
"item2": 1058,
"item3": 985,
"item4": 546,
"item5": 1184,
"item6": 1031,
"item7": 1448
},
"2005-11": {
"item1": 300,
"item2": 1021,
"item3": 967,
"item4": 474,
"item5": 1176,
"item6": 1009,
"item7": 1387
},
"2017-12": {
"item1": 307,
"item2": 1027,
"item3": 924,
"item4": 427,
"item5": 1024,
"item6": 844,
"item7": 1300
}
}
Run Code Online (Sandbox Code Playgroud)
我的排序功能,目前我只是通过尝试按升序或降序对第一项进行排序来开始。
function sortData(key, data, type) {
if (key === "item1") {
if (type === "asc") {
data.sort(function(a, b) {
return a[key] > b[key];
});
} else {
data.sort(function(a, b) {
return a[key] < b[key];
});
}
}
return data;
}
Run Code Online (Sandbox Code Playgroud)
这data是对象,我试图像这样传递它:sortData('item1', [data], 'asc');而不是只是data但没有运气。如果有人能阐明我做错了什么,那就太好了。
问题是数据不是数组,而 sort 是数组方法。您可以使用Object.keys来获取键的数组,对其进行排序,然后使用 a 填充值forEach:
let unsorted_data = { "2010-01": { "item1": 324, "item2": 1075, "item3": 940, "item4": 441, "item5": 1040, "item6": 898, "item7": 1343 }, "2011-02": { "item1": 295, "item2": 958, "item3": 904, "item4": 434, "item5": 1038, "item6": 793, "item7": 1246 }, "2012-03": { "item1": 314, "item2": 1062, "item3": 980, "item4": 494, "item5": 1158, "item6": 914, "item7": 1461 }, "2008-04": { "item1": 336, "item2": 1022, "item3": 987, "item4": 488, "item5": 1014, "item6": 792, "item7": 1382 }, "2007-05": { "item1": 332, "item2": 1073, "item3": 1002, "item4": 512, "item5": 1104, "item6": 840, "item7": 1368 }, "2005-06": { "item1": 311, "item2": 981, "item3": 837, "item4": 432, "item5": 1002, "item6": 801, "item7": 1265 }, "2014-07": { "item1": 321, "item2": 1049, "item3": 921, "item4": 489, "item5": 963, "item6": 881, "item7": 1340 }, "2015-08": { "item1": 294, "item2": 1071, "item3": 960, "item4": 506, "item5": 910, "item6": 885, "item7": 1312 }, "2016-09": { "item1": 281, "item2": 1020, "item3": 952, "item4": 502, "item5": 1068, "item6": 914, "item7": 1397 }, "2009-10": { "item1": 319, "item2": 1058, "item3": 985, "item4": 546, "item5": 1184, "item6": 1031, "item7": 1448 }, "2005-11": { "item1": 300, "item2": 1021, "item3": 967, "item4": 474, "item5": 1176, "item6": 1009, "item7": 1387 }, "2017-12": { "item1": 307, "item2": 1027, "item3": 924, "item4": 427, "item5": 1024, "item6": 844, "item7": 1300 } };
function sortData(key, data, type) {
let ordered = {};
let compareFunction = function(a, b) {
return data[b][key] - data[a][key];
};
if (type === "asc") {
compareFunction = function(a, b) {
return data[a][key] - data[b][key];
}
}
Object.keys(data).sort(compareFunction).forEach(function(key) {
ordered[key] = data[key];
});
return ordered;
}
console.log(sortData("item1", unsorted_data, 'asc'));Run Code Online (Sandbox Code Playgroud)
您仍然可以为 asc 和 desc 传递自定义比较函数。为了sort,但为了简单起见,我省略了它。
| 归档时间: |
|
| 查看次数: |
11811 次 |
| 最近记录: |