Как обычно делают Вас элементы сортировки в направляющих?

Если я правильно понял ваш вопрос, то, думаю, приведенный ниже код поможет решить вашу проблему. Это все ванильный JavaScript и не использует никаких функций d3.

По сути, я проанализировал вашу строку данных в массив записей. Я анализирую текущую запись в обратном вызове reduce, чтобы увидеть, имеет ли она большее значение свойства, чем текущий элемент max - если это так, она становится новым элементом max.

Я предоставил функцию под названием getMax, которая принимает массив данных, который я упомянул, в качестве первого параметра. getMax принимает второй параметр, который используется для определения максимального значения свойства, которое вы хотите найти.

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

function parse(s) {
  return s.split('\n').filter(el => el.length);
}

function generatePropertyKey(s) {
  var suffix = s.charAt(0).toUpperCase();
  suffix += s.substring(1);
  return `max${suffix}`;
}

function getMax(data, properyName) {
  var o = data.reduce((accum, el, idx) => {
    if (idx > 0) {
      var mk = generatePropertyKey(properyName),
        [
          sepalLength,
          sepalWidth,
          petalLength,
          petalWidth,
          species
        ] = el.split(',')

      var mv;
      switch (properyName) {
        case 'sepalLength':
          mv = sepalLength;
          break;
        case 'sepalWidth':
          mv = sepalWidth;
          break;
        case 'petalLength':
          mv = petalLength;
          break;
        case 'petalWidth':
          mv = petalWidth;
          break;
      }

      if (!accum[species] || (accum[species] && mv > accum[species][mk])) {
        accum[species] = {
          [mk]: mv,
          sepalLength,
          sepalWidth,
          petalLength,
          petalWidth
        };

        delete accum[species][properyName];
      }
    }

    return accum;
  }, {});

  return o;
}


//Demo code:
var data = parse(document.querySelector('#data').innerHTML);

var options = [
  'sepalLength',
  'sepalWidth',
  'petalLength',
  'petalWidth'
];

console.log(options.map(el => getMax(data, el)))
pre {
  display: none;
}
<pre id="data">
sepalLength,sepalWidth,petalLength,petalWidth,species
5.1,3.5,1.4,0.2,setosa
4.9,3,1.4,0.2,setosa
4.7,3.2,1.3,0.2,setosa
4.6,3.1,1.5,0.2,setosa
5,3.6,1.4,0.2,setosa
5.4,3.9,1.7,0.4,setosa
4.6,3.4,1.4,0.3,setosa
5,3.4,1.5,0.2,setosa
5.3,3.7,1.5,0.2,setosa
5,3.3,1.4,0.2,setosa
6.8,2.8,4.8,1.4,versicolor
6.7,3,5,1.7,versicolor
6,2.9,4.5,1.5,versicolor
5.7,2.6,3.5,1,versicolor
5.5,2.4,3.8,1.1,versicolor
5.5,2.4,3.7,1,versicolor
5.8,2.7,3.9,1.2,versicolor
6,2.7,5.1,1.6,versicolor
5.4,3,4.5,1.5,versicolor
6,3.4,4.5,1.6,versicolor
6.7,3.1,4.7,1.5,versicolor
6.3,2.3,4.4,1.3,versicolor
5.6,3,4.1,1.3,versicolor
5.5,2.5,4,1.3,versicolor
5.5,2.6,4.4,1.2,versicolor
6.1,3,4.6,1.4,versicolor
5.8,2.6,4,1.2,versicolor
5,2.3,3.3,1,versicolor
5.6,2.7,4.2,1.3,versicolor
5.7,3,4.2,1.2,versicolor
5.7,2.9,4.2,1.3,versicolor
6.2,2.9,4.3,1.3,versicolor
5.1,2.5,3,1.1,versicolor
5.7,2.8,4.1,1.3,versicolor
6.3,3.3,6,2.5,virginica
5.8,2.7,5.1,1.9,virginica
7.1,3,5.9,2.1,virginica
5.8,2.8,5.1,2.4,virginica
6.4,3.2,5.3,2.3,virginica
6.5,3,5.5,1.8,virginica
7.7,3.8,6.7,2.2,virginica
7.7,2.6,6.9,2.3,virginica
6,2.2,5,1.5,virginica
6.9,3.2,5.7,2.3,virginica
5.6,2.8,4.9,2,virginica
7.7,2.8,6.7,2,virginica
6.3,2.7,4.9,1.8,virginica
6.7,3.3,5.7,2.1,virginica
7.2,3.2,6,1.8,virginica
6.2,2.8,4.8,1.8,virginica
6.1,3,4.9,1.8,virginica
6.4,2.8,5.6,2.1,virginica
7.2,3,5.8,1.6,virginica
7.4,2.8,6.1,1.9,virginica
7.9,3.8,6.4,2,virginica
6.4,2.8,5.6,2.2,virginica
6.3,2.8,5.1,1.5,virginica
6.1,2.6,5.6,1.4,virginica
7.7,3,6.1,2.3,virginica
6.3,3.4,5.6,2.4,virginica
6.4,3.1,5.5,1.8,virginica
</pre>

27
задан Nathan Long 30 January 2012 в 15:31
поделиться

2 ответа

Используйте :order => 'criteria' для чего-либо простого, которое может быть сделано базой данных (т.е. основной алфавитный или хронологический порядок). Возможности, это намного быстрее, чем разрешение Вашему коду Ruby сделать это, предполагая наличие правильных индексов.

единственное время я мог думать, что необходимо использовать sort, метод - то, если у Вас есть сложный атрибут, это вычисляется во времени выполнения и не хранится в базе данных, как 'значение степени доверия', базирующееся от количества хороших/плохих ответов или чего-то. В этом случае лучше использовать sort метод, но знать, что это завинтит вещи при наличии разбиения на страницы (каждая страница будет иметь СВОИ результаты в порядке, но набор страниц в целом не будет работать).

34
ответ дан John Topley 28 November 2019 в 05:34
поделиться

Я указываю порядок в искателе ActiveRecord или в ассоциации моделей, потому что сортировка с использованием SQL выполняется быстрее. Вы должны воспользоваться возможностями, предлагаемыми СУБД, когда сможете это сделать.

2
ответ дан John Topley 28 November 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: