2013-10-07 8 views
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 в начале. Где я ошибся?

+1

Объекты неупорядочены, поэтому нет возможности «сортировать» ключи. – Blender

+0

@Blender никоим образом не вокруг? –

ответ

0

Как указал Блендер, объекты не заказываются. Вам нужно использовать массив. Существует несколько способов настроить этот массив, и как только вы получите данные в массиве, его очень легко отсортировать.

Вот несколько примеров. Во-первых, давайте попробуем сделать это массивом массивов. Внешний массив - это список элементов, и каждый элемент этого массива представляет собой массив из двух элементов, ваш ключ и ваше значение.

Так вставить этот код в вашу любимую консоль 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() вызов в каждом примере делает копию массива. Вы можете опустить это, если хотите отсортировать исходный массив.

+0

Майкл, я потерял дар речи. Большое вам спасибо за все время и силы, чтобы помочь мне! –

0

Единственный способ предполагать заказ - использовать массив. Как насчет массива объектов ключа/значения, например

return Object.keys(map).sort().map(function(k) { 
    return {key: k, value: foo[k]} 
}); 
Смежные вопросы