javascript - Bir diziyi önce boolean sütuna sonra string sütuna göre sıralama


İki alan tarafından bir diziyi sıralamaya çalışıyorum. Bir boolean değişkenim var: isFavorite ve bir string: name. True olan tüm boolean değerler ilk öğeler olmalı. Ama dizinin alfabetik olmasını istiyorum. Şu ana kadar kodum bu (birçok şey denedim):

data.sort(function (x,y) {
    if (x.isFavorite){
        return -1;
    }
    if (x.isFavorite && !y.isFavorite && (x.name < y.name)){
        return -1;
    }  else if ((x.isFavorite === y.isFavorite) && (x.name === y.name)){
        return 0;
    } else if (x.isFavorite && y.isFavorite && (x.name < y.name)){
        return -1;
    } else if (!x.isFavorite && !y.isFavorite && (x.name > y.name)){
        return 1;
    }
}

Cevap #1

Neden bu kadar çok şart ve örtüşme var?

İki alanı kullanarak diziyi sıralamak için sadece mantıksal VEYA operatörünü kullanın.

Ayrıca, Number'a dönüştürmeyi zorlamak için + (Boolean) kullandım.

grouperArray.sort((a, b) => (+a.isFavorite) - (+b.isFavorite) || a.name.localeCompare(b.name));

let data = [{ isFavorite:false, name:'A' }, { isFavorite:true, name:'C' }, { isFavorite:true, name:'B' }];
data.sort((a,b) => (+b.isFavorite) - (+a.isFavorite) || a.name.localeCompare(b.name));
console.log(data);

Cevap #2

const data = [
  {isFavorite: false, name: 'b'},
  {isFavorite: false, name: 'f'},
  {isFavorite: true, name: 'c'},
  {isFavorite: true, name: 'a'},
  {isFavorite: false, name: 'd'},
  {isFavorite: true, name: 'g'}
];

const sortedData = data.sort((a, b) => {
  if (a.isFavorite !== b.isFavorite) {
    return a.isFavorite ? -1 : 1;
  } else {
    return a.name > b.name ? 1 : -1;
  }
});
  
console.log(sortedData);

İlgili makaleler