2014-02-19 3 views
3

У меня есть набор данных с множеством объектов, занимающих 4 свойства объекта следующим образом:D3, сортировать массив объектов на 2 свойства объекта

var dataset = [{ 
    key: 0, 
    brand: "A", 
    value: 10, 
    size: 10 
}, { 
    key: 1, 
    brand: "B", 
    value: 11, 
    size: 10 
}, { 
    key: 2, 
    brand: "C", 
    value: 12, 
    size: 9 
}, { 
    key: 3, 
    brand: "D", 
    value: 13, 
    size: 9 
}, { 
    key: 4, 
    brand: "E", 
    value: 14, 
    size: 9 
}, { 
    key: 5, 
    brand: "G", 
    value: 15, 
    size: 9 
}, { 
    key: 6, 
    brand: "F", 
    value: 16, 
    size: 9 
}, { 
    key: 7, 
    brand: "H", 
    value: 17, 
    size: 9 
}, { 
    key: 8, 
    brand: "I", 
    value: 18, 
    size: 9 
}, { 
    key: 9, 
    brand: "J", 
    value: 19, 
    size: 9 
}, { 
    key: 10, 
    brand: "K", 
    value: 20, 
    size: 9 
}]; 

Я затем построить график с D3, показывающий value в виде горизонтальных линий и size как пузыри, сидящие поверх линий (см. http://jsfiddle.net/G74Aq/4/).

Я добавил функцию сортировки для каждого из вышеуказанных свойств объекта, кроме свойства key, которое используется для ключевой функции в сортировке. Это отлично работает при сортировке по имени и по значению, но когда я сортирую по размерам строки, а пузырьки сортируются по-разному. Обратите внимание, что это происходит только в том случае, если значение ключа увеличивается до 10, что говорит о проблемах с лексикографической сортировкой, которые, как я думал, можно обойти, добавив 0 перед каждым номером ключа ниже < 10 (что ничего не изменило).

Мой вопрос: почему разные элементы сортируются по-другому, хотя применяемые методы сортировки используют одну и ту же ключевую функцию? И, естественно, как я могу выровнять функции сортировки?

ответ

1

Попробуйте заставить его сортировать по числовому значению вместо строки. Унарный оператор + может выполнить это.

function getSortFunction(propertyName) { 
    return function(a, b) { 
     return +(a[propertyName]) > +(b[propertyName]); 
    } 
} 

dataset.sort(getSortFunction("size")); 
+0

Это определенно сокращает код, но, похоже, не влияет на проблемы сортировки. Я обновил скрипку (http://jsfiddle.net/G74Aq/8/). Может быть, существует путаница между значением 'd.key' и индексом массива' i', используемым для определения положения x? – lve

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