2017-10-20 43 views
1

J'ai trouvé quelques réponses à cette question, mais pour une raison quelconque, cela n'a pas fonctionné pour moi.Trier un tableau complexe d'objets en utilisant un attribut booléen en JavaScript

J'ai un grand nombre d'objets qui doivent être triés par une propriété booléenne (tous ceux qui sont true doivent apparaître en premier). La réponse la plus populaire que je trouve est:

let myList = [ 
    { 
    thing: <div>Something</div>, 
    sortingAttribute: false 
    }, 
    { 
    thing: <div>Something else</div>, 
    sortingAttribute: true 
    }, 
    { 
    thing: <div>Whatever</div>, 
    sortingAttribute: true 
    } 
    . 
    . 
    . 
] 

myList.sort((x, y) => { 
    return (x.sortingAttribute === y.sortingAttribute) ? 0 : x ? -1 : 1 
}) 

Malheureusement, cela ne fonctionne pas et je l'ai essayé de faire quelques variations de celui-ci, en vain.

Une alternative à ce fait simplement:

myList.sort((x, y) => {return x.sortingAttribute - y.sortingAttribute}) 

Cependant, il n'a pas non plus travaillé. J'ai également essayé d'utiliser la fonction sortBy de underscore, mais rien.

Je ne pense pas que cela ait quelque chose à voir avec cela, mais avant d'essayer de trier, je fais un .map() sur une autre liste pour obtenir myList comme c'est maintenant. Serait-ce en quelque sorte la cause du problème? A part ça, c'est assez simple.

Voici la fonction complète:

getMyList (basicArray) { 
    let myList = basicArray.map((arr, key) => { 
     const sortingAttribute = key > 2 // just used for the example 
     // the real code would obviously generate a more random order of trues and falses 

     // do other stuff 
     return { 
     thing: (<div key={key}>{stuff}</div>), 
     sortingAttribute: sortingAttribute 
     } 
    }) 

    myList.sort((x, y) => { 
     return (x.isQualified === y.isQualified) ? 0 : x ? -1 : 1 
    }) 
    console.log('myList SORTED', myList) 
    } 

Actuellement qui affiche exactement l'ordre qui a été craché du .map() Donc, pour un tableau de taille 5, nous avons:

faux , false, false, true, true

+1

fais-tu 'myList = myList.sort ((x, y) => {return x.sortingAttribute - y.sortingAttribute})'? –

+0

@Keith qui a fonctionné! Merci! Si tu veux, mais comme réponse, je peux le marquer. – theJuls

+0

en fonction de vos résultats, vous pouvez simplement appeler array.reverse(), alors votre sortie serait vrai, vrai, faux, faux, faux –

Répondre

2

Vous pouvez prendre le delta de la valeur booléenne b et la valeur a, car true devient la valeur 1 et false0 avec un moulage implicite en nombre avec l'opérateur moins.

var array = [false, true, false, false, true, true, false, true]; 
 

 
array.sort((a, b) => b - a); 
 

 
console.log(array);

+0

Yup, stupide, je les ai probablement inversés. Ça a marché! Merci! – theJuls