按键(字符串作为数字)对对象进行排序
sorting object by keys (strings as numbers)
我在对象中有这个数据集,键是字符串
{ '17': '17-17:30',
'20': '20:00-21',
'21': '21-22',
'22': '22-23',
'23': '23-24',
'01': '1-2',
'02': '2-3',
'03': '3-4',
'04': '4-5',
'05': '5-6',
'06': '6-7',
'07': '7-7:30',
'08': '08:50-9' }
我想按数字排列它们,以便 01 排在第一位,23 排在最后。
这是我使用的代码:
var sort_object = function(map) {
var keys = _.sortBy(_.keys(map), function(a) { return Number(a); });
var newmap = {};
_.each(keys, function(k) {
newmap[k] = map[k];
});
return newmap;
}
它仍然在开始时返回 17。我哪里做错了?
正如Blender指出的,对象不是有序的。您需要使用数组。有几种方法可以设置此数组,一旦数据位于数组中,就很容易对其进行排序。
以下是几个示例。首先,让我们尝试将其设置为数组数组。外部数组是元素列表,该数组的每个元素本身就是一个由两个元素组成的数组,即键和值。
因此,请将此代码粘贴到您最喜欢的JavaScript控制台中,例如Chrome中的控制台:
var data = [
[ '17', '17-17:30' ],
[ '20', '20:00-21' ],
[ '21', '21-22' ],
[ '22', '22-23' ],
[ '23', '23-24' ],
[ '01', '1-2' ],
[ '02', '2-3' ],
[ '03', '3-4' ],
[ '04', '4-5' ],
[ '05', '5-6' ],
[ '06', '6-7' ],
[ '07', '7-7:30' ],
[ '08', '08:50-9' ]
];
var result = data.slice().sort( function( a, b ) {
return +a[0] - +b[0];
});
JSON.stringify( result, null, 4 );
它将记录:
[
[
"01",
"1-2"
],
[
"02",
"2-3"
],
[
"03",
"3-4"
],
[
"04",
"4-5"
],
[
"05",
"5-6"
],
[
"06",
"6-7"
],
[
"07",
"7-7:30"
],
[
"08",
"08:50-9"
],
[
"17",
"17-17:30"
],
[
"20",
"20:00-21"
],
[
"21",
"21-22"
],
[
"22",
"22-23"
],
[
"23",
"23-24"
]
或者,您可以使用对象数组代替数组数组。这通常更方便使用。将此代码粘贴到 JavaScript 控制台中:
var data = [
{ key: '17', value: '17-17:30' },
{ key: '20', value: '20:00-21' },
{ key: '21', value: '21-22' },
{ key: '22', value: '22-23' },
{ key: '23', value: '23-24' },
{ key: '01', value: '1-2' },
{ key: '02', value: '2-3' },
{ key: '03', value: '3-4' },
{ key: '04', value: '4-5' },
{ key: '05', value: '5-6' },
{ key: '06', value: '6-7' },
{ key: '07', value: '7-7:30' },
{ key: '08', value: '08:50-9'}
];
var result = data.slice().sort( function( a, b ) {
return +a.key - +b.key;
});
JSON.stringify( result, null, 4 );
它将记录:
[
{
"key": "01",
"value": "1-2"
},
{
"key": "02",
"value": "2-3"
},
{
"key": "03",
"value": "3-4"
},
{
"key": "04",
"value": "4-5"
},
{
"key": "05",
"value": "5-6"
},
{
"key": "06",
"value": "6-7"
},
{
"key": "07",
"value": "7-7:30"
},
{
"key": "08",
"value": "08:50-9"
},
{
"key": "17",
"value": "17-17:30"
},
{
"key": "20",
"value": "20:00-21"
},
{
"key": "21",
"value": "21-22"
},
{
"key": "22",
"value": "22-23"
},
{
"key": "23",
"value": "23-24"
}
]
无论哪种方式,如您所见,一旦您的数据具有合适的格式(即整个数据需要是一个数组(,那么对其进行排序就变得非常简单。
让我们更详细地看一下该排序函数(使用第二个示例(:
var result = data.slice().sort( function( a, b ) {
return +a.key - +b.key;
});
在此代码中,a.key
获取其中一个数组元素的 key
属性的值。前面的+
将字符串转换为数字 - 很像使用 Number
函数,但更简单的方法。同样对于+b.key
.然后减去这两个数字得到正确的排序函数返回:正值、负值或零值,具体取决于a.key
或b.key
是两者中的较大值还是相等。
第一个示例的工作方式类似,只是使用 +a[0] - +b[0]
而不是 +a.key - +b.key
.
每个示例中的.slice()
调用都会创建数组的副本。如果要对原始数组进行排序,可以省略它。
暗示顺序的唯一方法是使用数组。键/值对象数组怎么样,例如
return Object.keys(map).sort().map(function(k) {
return {key: k, value: foo[k]}
});
相关文章:
- 如何在节点中进行 Json 对象排序.js
- jQuery.每个对象排序
- Javascript对象排序
- Javascript 对象排序
- Javascript中的JSON对象排序
- jQuery停止对象排序
- 带有下划线排序的对象排序的数组
- JS对象排序日期排序
- JSON对象排序被jQuery或Javascript篡改
- 高级对象排序
- 将json对象排序到嵌套树中
- 按两个不同的条件对数组中的对象排序
- 如何在angular js中使用自定义排序顺序对对象排序
- 在AngularJS的ng-repeat中,使用Underscore/Lodash按值将对象排序为一对数组
- 给定一个对象数组,如何根据深度为n的属性对对象排序
- JavaScript数组对象排序没有按预期工作
- 对数组内的对象排序
- 自定义javascript对象排序和维护索引关联
- Javascript对象排序不工作
- Javascript对象的对象排序