Я хочу отсортировать массив объектов в JavaScript с двумя свойствами Boolean value и Int

Я хочу отсортировать массив объектов в JavaScript с двумя свойствами: логическим значением и значением Int. Я хочу, чтобы вывод был таким:

{
    first_name: 'sumeet',
    last_name: 'Prentice',
    offerApplicable: 'TRUE',
    price: 40
}, {
    first_name: 'Pirate',
    last_name: 'Prentice',
    offerApplicable: 'TRUE',
    price: 50
}, {
    first_name: 'Lazslo',
    last_name: 'Jamf',
    offerApplicable: 'TRUE',
    price: 60
}, {
    first_name: 'jitendra',
    last_name: 'Prentice',
    offerApplicable: 'TRUE',
    price: 101
}

Все объекты с истинными значениями сначала также сортируются по цене, а затем все объекты, имеющие логическое значение как ложные. я могу отсортировать их по логическому значению, но я также хочу отсортировать их по цене.

я пробовал это

var objs = [ 
    { first_name: 'Lazslo', last_name: 'Jamf'   ,offerApplicable: 'TRUE' ,price: 60 },
    { first_name: 'Pig',    last_name: 'Bodine'  , offerApplicable: 'FALSE' ,price: 100},
    { first_name: 'Pirate', last_name: 'Prentice' ,offerApplicable: 'TRUE' ,price: 50},
    { first_name: 'nithesh',    last_name: 'Bodine'  , offerApplicable: 'FALSE' ,price: 40},
    { first_name: 'sumeet', last_name: 'Prentice' ,offerApplicable: 'TRUE' ,price: 40},
    { first_name: 'mahesh',    last_name: 'Bodine'  , offerApplicable: 'FALSE' ,price: 40},
    { first_name: 'jitendra', last_name: 'Prentice' ,offerApplicable: 'TRUE' ,price: 101}
];
function compare(a,b) {
    var aConcat = a["offerApplicable"] + a["price"];
      var bConcat = b["offerApplicable"] + b["price"];
  if (aConcat < bConcat )
    return 1;
  if (aConcat > bConcat )
    return -1;
  return 0;

}

console.log(objs.sort(compare));

я получаю вывод, как это

first_name : "Lazslo" last_name : "Jamf" offerApplicable: "ИСТИННАЯ" цена: 60

:first_name : "Пират" last_name : Предложение "Ученик"Применимо: "ИСТИННАЯ" цена: 50

first_name : "sumeet" last_name : "Prentice" offerApplicable: "ИСТИННАЯ" цена: 40

first_name : "jitendra" last_name : "Prentice" offerApplicable: "ИСТИННАЯ" цена: 101

first_name : "nithesh" last_name : предложение "Bodine"Применимо : "FALSE" цена : 40

first_name : "mahesh" last_name : предложение "Bodine"Применимо : "FALSE" цена : 40

first_name : "Свинья" last_name : Предложение "Bodine"Применимо : "FALSE" цена : 100

любая помощь спасибо заранее.


person WSM RWL    schedule 22.06.2017    source источник


Ответы (3)


Вы можете связать критерии для значения возврата функции сортировки Array#sort.

Первая часть

(b.offerApplicable === 'TRUE') - (a.offerApplicable === 'TRUE')

выполняет проверку, если значение offerApplicable равно 'TRUE'. Сравнение с true перемещает элемент вниз, поэтому нам нужно переключить проверку с a и b.

Вторая часть

a.price - b.price

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

var array = [{ first_name: 'Lazslo', last_name: 'Jamf', offerApplicable: 'TRUE', price: 60 }, { first_name: 'Pig', last_name: 'Bodine', offerApplicable: 'FALSE', price: 100 }, { first_name: 'Pirate', last_name: 'Prentice', offerApplicable: 'TRUE', price: 50 }, { first_name: 'nithesh', last_name: 'Bodine', offerApplicable: 'FALSE', price: 40 }, { first_name: 'sumeet', last_name: 'Prentice', offerApplicable: 'TRUE', price: 40 }, { first_name: 'mahesh', last_name: 'Bodine', offerApplicable: 'FALSE', price: 40 }, { first_name: 'jitendra', last_name: 'Prentice', offerApplicable: 'TRUE', price: 101 }];

array.sort(function (a, b) {
    return (b.offerApplicable === 'TRUE') - (a.offerApplicable === 'TRUE') || a.price - b.price;
});    

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

person Nina Scholz    schedule 22.06.2017

objs.sort(function (a, b) {
    return (a.price - b.price);
});

objs.sort(function (a, b) {
    var price1 = (a.offerApplicable === 'TRUE');
    var price2 = (b.offerApplicable === 'TRUE');
    return price2 - price1;
});

Сначала мы сортируем значения по цене, а затем сортируем значение по полю offerApplicable.

Комбинированное решение:

objs.sort(function (a, b) {
    var price1 = (a.offerApplicable === 'TRUE');
    var price2 = (b.offerApplicable === 'TRUE');
    return price2 - price1 || a.price - b.price;
});
person gauravmuk    schedule 22.06.2017
comment
вы предполагаете стабильную сортировку, которая не предоставляется. - person Nina Scholz; 22.06.2017

Просто сделайте это в несколько шагов.

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

что-то вроде этого

const trueEntities = defaultArray.filter(e => e.offerApplicable === 'TRUE');
const falseEntities = defaultArray.filter(e => e.offerApplicable === 'FALSE');

затем отсортируйте эти массивы по цене

const sortedByPriceTrue = trueEntities.sort((a, b) => a.price - b.price);
const sortedByPriceFalse =  falseEntities.sort((a, b) => a.price - b.price);

а затем просто вернуть/использовать в массивах конкатированных переменных

return sortedByPriceTrue.concat(sortedbyPriceFalse);

я знаю, что это решение может быть медленнее, чем одна операция, но гораздо более читабельно

p.s. отредактировано, первое решение тоже не сработало

person vanless    schedule 22.06.2017