@xenonhammer

Как сортировать массив в котором значение может быть и строкой и числом-строкой?

Пробовал так:
Искал совпадение по строке
spoiler
let sortStr = new RegExp('Договорная', 'mgi')
     if(sortStr.test(a.price) && !sortStr.test(b.price)) {
                return a.price < b.price 
     }else if(!sortStr.test(a.price) && sortStr.test(b.price)){ 
                return a.price > b.price
      }else if(!sortStr.test(a.price) && !sortStr.test(b.price)){
                return  a.price === b.price
      }else{
                return a.price - b.price
      }

Потом так:
Искал совпадение по числам
spoiler
let sortStr = new RegExp('^[0-9]+', 'mgi')
if(a.price.search(sortStr) !== -1 && b.price.search(sortStr) === -1) {
    return a.price < b.price 

}else if(a.price.search(sortStr) === -1 && b.price.search(sortStr) !== -1){ 
    return a.price > b.price

}else if(a.price.search(sortStr) === -1 && b.price.search(sortStr) === -1){
    return a.price === b.price
    
}else{
    return a.price - b.price
}
  • Вопрос задан
  • 115 просмотров
Решения вопроса 2
lovebarcafc
@lovebarcafc
Кратко не получится
[...].sort((a, b) => (typeof b.price === 'string') ? -1 : +b.price - +a.price)
Ответ написан
function isString (obj) {
  return (Object.prototype.toString.call(obj) === '[object String]');
}

function compare( a, b ) {
  if((isString(a.price) && isString(b.price)) || (!isString(a.price) && !isString(b.price))){
    if(a.price>b.price)
        return 1;
    if(a.price<b.price)
        return -1;
  }
  if((isString(a.price) && !isString(b.price)) || (!isString(a.price) && isString(b.price)))
    return isString(a.price)?-1:1
  return 0;
}

function sorter(map) {
    var data = [];
    for (var key in map) data.push(map[key]);
    data.sort(compare);
    var sorted= {};
    data.forEach(function (el,index) {
        sorted[index]=el;
    });
    return sorted;
}

Для сортировки использовать последнюю функцию
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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