2016-10-21 4 views
2

Я пытаюсь сортировать мои столбцы основываясь на поле «Value», который представляет собой комбинацию строк и числовых значений в следующем порядкеСортировка полей столбцов смешанных строк и числовых значений

var ascending = ["","","", 0, 0, 0.71, 1] 

var descending = [1, 0.71,0,0,"","",""] 

Я попытался ниже алгоритм сортировки , но это не дает желаемых результатов

function mySort(v1,v2) { 
var v1 = obj1[colName]; 
      var v2 = obj2[colName]; 

      if(v1 === ""){ 
       return 1; 
      } 
      else if(v2 === ""){ 
       return -1; 
      } 
      else if(v1 === v2){ 
       return 0; 
      } 
      else if(!sortObj.descending) { 
       return v1 < v2 ? -1 : 1; 
      } 
      else if(sortObj.descending) { 
       return v1 < v2 ? 1 : -1; 
      } 
} 

Выше алгоритм сортировки всегда держит "" в нижней части, которая не требуется в моем случае. Что мне не хватает?

+0

вы должны сохранить кавычки делать, или это нормально, если эти значения принуждают к Number ('0')? Потому что '[" "," ", 0," ", 1, 0.71, 0] .map (Number) .sort()' отлично работает –

+0

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

+0

Сделайте возвращаемое значение ваших '' '' сравнений, зависящих от 'sortObj.descending', как в' return sortObj.descending? 1: -1', и наоборот для второго '' ''. –

ответ

1
var arr = ["", "", 0, "", 1, 0.71, 0]; 
var asc = arr.slice().sort(); 
var desc = asc.slice().reverse(); 

slice() метод возвращает неполную копию части массива в новый объект массива.

Метод sort() сортирует элементы массива на месте и возвращает массив.

Метод reverse() отменяет массив на месте.

+0

Привет, это работает, если мой вход - это просто массив. Я пытаюсь выполнить сортировку по полям столбца, и в этом случае это не сработает – nikitha

+1

Ответ: только код не является хорошим ответом. Добавьте некоторые объяснения/ссылки на источники ... – Dekel

+0

@nikitha, что вы подразумеваете под «столбцами»? В javascript отсутствует определение столбца. Пожалуйста, объясни. – Dekel

0

Удалите эти операторы IF из вашей функции.

if(v1 === ""){ 
     return 1; 
    } 
    else if(v2 === ""){ 
     return -1; 
    } 

Номера и строки, подобные этому, уже сопоставимы в JS.

Edit:

Для сравнения 0 Вы можете попробовать это в начале функции:

if(v1 === 0) 
    v1 = v1.toString(); 
if(v2 === 0) 
    v2 = v2.toString(); 
// the rest of your logic here 

Вы можете извлечь его в метод, так что вы не повторять код.

+1

Но как он сравнивает "" и нули? – nikitha

+0

@nikitha: они численно равны, поэтому вам не гарантируется, что все строки будут группироваться вместе. –

+0

Есть ли способ, чтобы эти строки были сгруппированы. Я не могу добиться своей функции сортировки – nikitha

1

Вы можете отсортировать сначала пустые строки, затем цифры.

var arr = ["", "", 0, "", 1, 0.71, 0, 10, 20, 2]; 
 

 
arr.sort(function (a, b) { 
 
    return (a !== "") - (b !== "") || (a || 0) - (b || 0); 
 
}); 
 
console.log(arr);

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