0

我在对象中有这个数据集,键是字符串

 { '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。我哪里做错了?

4

2 回答 2

0

暗示顺序的唯一方法是使用数组。一组键/值对象怎么样,例如

return Object.keys(map).sort().map(function(k) {
    return {key: k, value: foo[k]}
});
于 2013-10-07T04:55:01.793 回答
0

正如 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.keyb.key是否相等。

第一个示例的工作方式类似,只是使用+a[0] - +b[0]而不是+a.key - +b.key.

每个示例中的.slice()调用都会生成数组的副本。如果要对原始数组进行排序,可以省略它。

于 2013-10-07T06:15:24.420 回答