2015-05-27 2 views
2

У меня есть данные JSON, и я хочу группировать поле, а затем сортировать по счету.d3.js сортировка по сводному полю

var data = [{"Name":"Ravi","Country":"India"}, 
      {"Name":"Alex","Country":"USA"}, 
      {"Name":"Stew","Country":"UK"}, 
      {"Name":"Mary","Country":"India"}, 
      {"Name":"Raju","Country":"India"}, 
      {"Name":"Bill","Country":"UK"}, 
      {"Name":"Elisa","Country":"UK"}, 
      {"Name":"Sharma","Country":"India"}]; 

и мой d3.js запрос является следующей

var countryCount = d3.nest() 
        .key(function(d) { return d.Country; }) 
        .rollup(function(a){return a.length;}) 
        .entries(data); 
console.log(JSON.stringify(countryCount)); 

и моего выход

[{"key":"India","values":4},{"key":"USA","values":1},{"key":"UK","values":3}] 

моего желаемого выходом (сортируется по значению накопительного пакета)

[{"key":"India","values":4},{"key":"UK","values":3},{"key":"USA","values":1}] 

Как я могу это сделать? Я знаю, что следующий метод сортировки по умолчанию в браузере также дает желаемый результат. Но просто хочу очистить ли d3.js любой встроенный метод для достижения этого.

console.log(JSON.stringify(countryCount.sort(function (a, b){ 
    if (a.values > b.values) {return -1;} 
    else if (a.values < b.values) { return 1;} 
    else return 0; 
}))); 
+1

вы можете использовать countryCount.sort (функция (а, Ь) {d3.ascending (a.values, b.values)}) – KennyXu

+0

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

+0

Я не думаю, что это необходимо. array.sort, если просто, кроме того, d3 предоставил две вспомогательные функции d3.ascending и d3.decending. – KennyXu

ответ

0

Нет, нет встроенной функции, дающей результат после вас. d3.nest() имеет метод nest.sortValues(), который сортирует листовые элементы вложенных данных, но это не имеет смысла в вашем случае, так как вы применили .rollup(), оставляя вас всего одним листом за ключ. Как вы уже упоминали, путь к использованию - Array.prototype.sort().

2

D3 предоставить условие, ascendingdescending, и вы можете использовать его на sort method. Не беспокойтесь Вы не используете родной яваскрипт метод с хорошим stability

var countryCount = d3.nest() 
        .key(function(d) { return d.Country; }) 
        .rollup(function(a){return a.length;}) 
        .entries(data) 
        .sort(function(a, b){ return d3.ascending(a.values, b.values); }) 

console.log(JSON.stringify(countryCount)); 
+1

Хотя этот ответ был принят @SriramajeyamSugumaran как правильный ответ, он не показывает способ d3, выполняющий сортировку. Используемый метод 'sort()' не является одним из API d3, а 'Array.prototype.sort()', который уже упоминался OP. Вы просто помещаете 'd3.ascending()', чтобы использовать, который, посмотрев на документацию/реализацию, с которой вы связаны, логически эквивалентен функции сравнения в вопросе выше. Нет встроенной функции, которая сортирует листовые узлы по запросу. – altocumulus

+1

На самом деле, это то же самое решение, предложенное @ user1465639 в первом комментарии к вопросу, который был отклонен OP как не желательный подход, основанный только на d3. – altocumulus

+0

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

0

d3 обеспечивает способ sortKeys в функции гнезда, которое будет сортировать ваш вложенный список на основе ключа, который вы выбрали. Вы можете пройти d3.ascending или d3.descending, исходя из ваших требований.

Из вашего примера:

var countryCount = d3.nest() 
        .key(function(d) { return d.Country; }) 
        .sortKeys(d3.ascending) 
        .entries(data);

который даст вам:

[{"key":"India","values":4},{"key":"UK","values":3},{"key":"USA","values":1}]
Смежные вопросы