2014-10-15 2 views
1

У меня есть объект буквального следующим образом:JavaScript: Оптимизация сортировки пользовательского объекта буквального

var obj = { 
    one: "short-term", 
    two: "long-term", 
    three: "mid-term", 
    four: "long-term", 
    five: "short-term", 
    six: "short-term", 
    seven: "long-term", 
    eight: "mid-term", 
    nine: "short-term", 
    ten: "mid-term" 
}; 

И я хотел бы сортировать порядок пар ключ/значение, на основе значения, таким образом, что конечный результат будет быть:

var obj = { 
    one: "short-term", 
    five: "short-term", 
    six: "short-term", 
    nine: "short-term", 
    three: "mid-term", 
    eight: "mid-term", 
    ten: "mid-term", 
    two: "long-term", 
    four: "long-term", 
    seven: "long-term" 
}; 

Мой метод сортировки довольно проста и, вероятно, неэффективна (Вот FIDDLE):

var sorted = {}; 

for (var i in obj) { 
    if (obj[i] === "short-term") { 
     sorted[i] = obj[i]; 
    } 
} 
for (var i in obj) { 
    if (obj[i] === "mid-term") { 
     sorted[i] = obj[i]; 
    } 
} 
for (var i in obj) { 
    if (obj[i] === "long-term") { 
     sorted[i] = obj[i]; 
    } 
} 

Возможно ли, чтобы данный данный сценарий достиг того же результата путем циклического перехода через объект только один раз с использованием или без использования jQuery, но не с другими библиотеками?

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

+2

Вы не можете сортировать объекты. Пара ключей-значений не имеет порядка. – Bergi

+0

@Bergi - Итак, что у меня есть так хорошо, как получается? – BinaryCat

+1

Используйте массив вместо этого. – Bergi

ответ

2

без изменения своей структуры OBJ, вы могли бы сделать:

var sortedKeys=[]; 
for(var i in obj){ 
    sortedKeys.push({key:i, value:obj[i]}) // push key and value to array 
} 
sortedKeys.sort(function(a,b){ // sort array by value 
    return a.value < b.value 
}) 
for(var i=0;i<sortedKeys.length;i++){ // you can either use now sortedKeys or keep using obj 
    console.log(obj[sortedKeys[i].key]) 
    console.log(sortedKeys[i].value) 
} 
-1

Объекты в Javascript являются hashmaps. Вы не должны ожидать, что каждый интерпретатор - например, браузеры, если это будет выполняться на странице, - чтобы представить вам ключи в том же порядке, в который они были вставлены.

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

var obj = { 
    one: { value: "short-term", order: 1 }, 
    five: { value: "short-term", order: 2 }, 
    /* .. SNIP .. */ 
}; 

Тогда вы можете придумать механизм сортировки и применить, что всякий раз, когда вам нужно получить ваши ценности.

Смежные вопросы