2016-10-28 3 views
0

[EDIT: Все это отличные методы для изменения способа сортировки. Однако я не могу изменить метод сортировки, если только один из вас не знает, как это сделать. В моем JS есть очень длинный алгоритм сортировки, который я не писал. Я не уверен, как отредактировать его, чтобы включить любой из этих методов сортировки. Поэтому почему я попросил способ сделать их сортировкой по алфавиту, просто изменив сами строки.]Javascript, сортируя числа в таблице HTML с различным количеством цифр

У меня есть таблица с кнопкой сортировки, и все работает, за исключением 1 колонки.

Как я сортирую 6" , 12" и 18 "?

Они сортируют в порядке 6" 18" 12" из-за кавычек. Я действительно не хочу удалять кавычки и указывать в заголовке, что он измеряется в дюймах ... и я не хочу ставить 0 до 6 (что также будет работать). В идеале я хочу разместить пробел до 6, но это пространство игнорируется для сортировки. У кого-нибудь есть мысли?

Мои входы только определены в простом массиве:

var paras1 = [ 
    ["K"], 
    ["-270°C to 1372°C, –454°F to 2501°F"], 
    ['0.125 (1/8")', '0.1875 (3/16")', '0.250 (1/4")'], 
    ['6"', '12"', '18"'], //-------THE LINE THAT I CARE ABOUT------- 
    ["316SS"], 
    ["Grounded", "Ungrounded", "Exposed"], 
]; 

Ive пытался следующее:

[' 6"', '12"', '18"'] //with space doesnt work 
['06"', '12"', '18"'] //with 0 works and looks ugly 
['6', '12', '18']  //works but not what i want 

Если у вас есть какие-то творческие символы, которые помогли бы сортировать, вы можете попробовать их на строка 486, если это помогает, https://jsfiddle.net/msirkin/duw5nyqe/9/

+2

Число должно быть независимым от единицы измерения. Таким образом, вы ДОЛЖНЫ удалить «и правильно отсортировать его как число.Если вы действительно должны сохранить единицу измерения, то используйте его как отдельное свойство объекта, например [{значение: 25, uom: 'inches'}, { значение: 42, uom: 'inches'}, {value: 17, uom: 'inches'}]. Затем сортируйте по свойству value и покажите данные в соответствии с единицей измерения. Сохраните свою модель данных и как она должна отображаться в отдельном пользовательском интерфейсе. – ManoDestra

+1

Вы можете удалить сортировку '' 'во время сортировки. Вам не нужно это делать постоянно. – JJJ

+0

Вы используете лексикографическую сортировку вместо цифровой сортировки. Держите свои необработанные данные в виде чисел, а затем выполните сортировку, при отображении значения добавьте соответствующие дополнительные знаки – Boaz

ответ

1

Убедитесь, что строки сравниваются как числа, установив функцию сравнения в сортировке.

Может быть, у вас есть лучший способ добавить имя класса для ваших колонок таблицы, , но в вашей скрипке демо: https://jsfiddle.net/msirkin/duw5nyqe/9/ Я добавил «» sorttable_numeric класс программно для длины столбца, в строке 622, прямо перед eo_head_row.appendChild (headCell). Вы можете добавить больше параметров, подобных этому для других столбцов, которые нужно сортировать численно: (k == "para4" || k == "para5").

if (k == "para5") {headCell.className += ' sorttable_numeric';} 
+0

Я действительно не знаю как изменить метод сортировки js, который у меня есть.Я не писал его, и он довольно длинный. Извините, что, будучи неясным, я редактировал свой вопрос, чтобы указать, что я ищу способ сделать мои значения по алфавиту сортируются как строки –

+1

В вашей скрипте вам нужно добавить класс «sorttable_numeric» в столбец заголовка yo, чтобы сортировать правильно (столбец «Длина»). –

+1

Удалите ноль в 06 ", это не стабильное исправление, т. е. если у вас есть значение 100 ", оно все равно будет отсортировано как менее 12". –

1

Вы можете использовать sorting with map и использовать числовые значения.

// the array to be sorted 
 
var list = ['18"', '6"', '12"']; 
 

 
// temporary array holds objects with position and sort-value 
 
var mapped = list.map(function(el, i) { 
 
    return { index: i, value: el.match(/\d+(?=")/) }; 
 
}); 
 

 
// sorting the mapped array containing the reduced values 
 
mapped.sort(function(a, b) { 
 
    return a.value - b.value; 
 
}); 
 

 
// container for the resulting order 
 
var result = mapped.map(function(el){ 
 
    return list[el.index]; 
 
}); 
 

 
console.log(result);

Или использовать сорт непосредственно с числовыми значениями.

// the array to be sorted 
 
var list = ['18"', '6"', '12"']; 
 

 
list.sort(function(a, b) { 
 
    function getNumber(s) { return s.match(/\d+(?=")/); } 
 
    return getNumber(a) - getNumber(b); 
 
}); 
 

 
console.log(list);

+0

Оба они имеют смысл, но я действительно не знаю, как изменить метод сортировки js, который у меня есть. Я не писал, и это довольно долго. Извините за неясность, я отредактировал свой вопрос, чтобы указать, что я ищу способ сделать мои значения внутренне отсортированными по алфавиту в виде строк –