ак сортировать набор чисел как лексикографически, так и численно?

¬ насто¤щее врем¤ у мен¤ есть набор строк, которые ¤вл¤ютс¤ как просто числами, так и числом с + или -. Ќапример:

1, 1+, 1-, 2, 2+, 2-, 1 var numbers = [ '1' , '1-' , '1+' , '2' , '2+' , '2-' , ' 10 ' ]; числа . рода ( функци¤ ( , б ) { вар _a = parseFloat ( ), // ≈сли значени¤ только целые числа, ParseInt будет делать тоже _b = parseFloat ( б ); если ( _A - _b === 0 ) { return ( a > b ) ? 1 : - 1 ; } else { return _a - _b ; } }); консоль . log ( числа );

 оторый когда ¤ сортирую с помощью функций сортировки JavaScript, выдает:

1, 1+, 1-, 10, 2, 2+, 2-

который ¤вл¤етс¤ двудоменным, но не численно. ≈сть ли способ отсортировать это, чтобы числа выходили правильно (первый список)? я использую магазины ExtJS, поэтому ответы, как сортировщик магазина, предпочтительнее, но простой javascript тоже прекрасен. Ѕлагодар¤ ?

»зменить: это не просто сортировка чисел.

javascript,sorting,extjs,lexicographic,

3

Ответов: 6


2 прин¤т

¬ы можете использовать пользовательскую функцию заказа так:

negative, 0, positive

‘ункци¤ провер¤ет, равны ли значени¤ числа, и если да, то возвращаетс¤ к лексикографическому упор¤дочению дл¤ сортировки символов 0ixes. ≈сли в равном случае нет суффиксов, следовательно, независимо от того, в каком пор¤дке возвращаютс¤ числа. ≈сли только один из операндов имеет суффикс, голый номер возвращает отрицательный. ≈сли значени¤ числа не равны, функци¤ просто возвращает тристат, т. ≈.  оторый будет оцениватьс¤ одним из . »ли на самом деле это Ђбистаутї, так как мы уже обрабатывали дело.var numbers = ['1', '1-r', '1+q', '1', '2', '2+q', '2-r', '10']; function suffixSort (suff, asc) { asc = 2 * +(!!asc) - 1; // Convert boolean to -1 or 1 return function (a, b) { var _a = parseFloat(a), // Extract the number value _b = parseFloat(b), aSI = -(a.length - _a.toString().length), // Get the index of suffix start bSI = -(b.length - _b.toString().length); // Equal number values, sort by suffixes if (_a === _b) { return (suff.indexOf(a.substr(aSI)) > suff.indexOf(b.substr(bSI))) ? 1 : -1; } // Inequal number values, sort by numbers return asc * (_a - _b); } } // suffixSort arguments // suff: An array of the suffix strings to sort, ordered in the desired sorting order // asc: true = ascending, false = descending. Optional, defaults to descending sort numbers.sort(suffixSort(['+q', '-r'], true)); console.log(numbers);suffixSort0


Ѕолее общее решение

¬ышеприведенный код скорее ¤вл¤етс¤ особым случаем только дл¤ двух разных одиночных суффиксов. ≈сли суффиксы более сложны, вот более общий код дл¤ сортировки по числу и суффиксам:

suff

»де¤ состоит в том, чтобы хранить суффиксы в массиве, и когда необходима сортировка суффиксов, функци¤ сравнивает индексы массива суффиксов вместо самих суффиксов.

praseIntпозвол¤ет также определить направление сортировки. ¬ыбранное направление сортировки не вли¤ет на сортировку суффиксов, они всегда возвращаютс¤ в пор¤дке их по¤влени¤ в suffмассиве.


0

Ёти значени¤ ¤вл¤ютс¤ почти целыми числами, поэтому сравнение их в зависимости от x-вас почти приведет вас туда. ≈динственное, чего не хватает, это специальное обращение к значени¤м, которые имеют одну и ту же целую часть, где xдолжно быть первым, а затем xи наконец x+:

function specialChar(s) {
    c = s.substr(-1);
    if (c == '+') {
        return 1;
    }
    if (c == '-') {
      return -1;
    }
    return 0;
}

function numCompare(a, b) {
    aNum = parseInt(a);
    bNum = parseInt(b);
    cmp = aNum - bNum;
    if (cmp != 0) {
        return cmp;
    }
    // Integer parts are equal - compare the special char at the end
    return specialChar(a) - specialChar(b);
}

arr = ['1' , '1+', '1-', '2', '2+', '2-', '10'];
arr.sort(numCompare);

0
  var result=[]; 
        result=array.map(function(n){
          if(typeof n==='number') return n;
            if(n[n.length-1]=='+'){
              return parseInt(n.substring(0,n.length-1))
              }
            else if(n[n.length-1]=='-'){
               return 0-parseInt(n.substring(0,n.length-1))
               }
            });
 result.sort(function(a,b){return a-b})

0

¬ы можете использовать Array#sortи разбивать элементы в числах и остальном, а затем возвращать разницу или разницу в пор¤дке.

var array = ['10', '2', '2+', '2-', '1', '1+', '1-'];

array.sort(function (a, b) {
    var r = /d+|D+/g,
        aa = a.match(r),
        bb = b.match(r),
        order = { '+': 1, '-': 2 };

    return aa[0] - bb[0] || (order[aa[1]] || 0) - (order[bb[1]] || 0);
});

console.log(array);


0

≈сли имеетс¤ только три возможных состо¤ни¤ числа, а состо¤ни¤ имеют пор¤док, number, number+, numberто состо¤ни¤ могут быть воссозданы путем создани¤ представлени¤ чисел в массиве, удалени¤ уникальных чисел из массива, от минимума до максимума, конкатенировани¤ пустой строки или арифметического оператора в требуемый пор¤док номера, а затем нажатие значени¤ в массив, где .toString()можно использовать дл¤ просмотра строкового представлени¤ разделенных зап¤тыми отсортированных значений в массиве

var str = `314+, 1-, 7+, 1, 1-, 271-, 10-
          , 10+, 271, 271+, 314-, 314
          , 10, 2-, 2, 2+, 7-, 7`;

for (var [nums, order, res, num] = [str.match(/d+/g), ["", "+", "-"], [], null]
     ; nums.length
     ; num = Math.min.apply(Math, nums)
       , res = [...res, ...order.map(op => num + op)]
       , nums = nums.filter(n => n != num)
    );

console.log(res.toString() + "
", res);

JavaScript, сортировка, ExtJS, лексикографический,