1
votes

comment déplacer des éléments vers le haut dans un tableau d'objets?

J'ai un tableau comme:

user.sort(function(a,b){
    a.isActive ? 1 : b.isActive ? -1 : 0
});

Ce que je veux faire est de trier le tableau de sorte que, l'utilisateur avec isActive soit aussi vrai, tous soient poussés vers le haut. J'ai essayé de suivre mais cela n'a pas fonctionné.

var user = [{name: 'name1', isActive: false}, {name: 'name2', isActive: false}, {name: 'name3', isActive: true}, {name: 'name4', isActive: false}, {name: 'name9', isActive: true}, {name: 'name8', isActive: false}];


0 commentaires

7 Réponses :


0
votes

J'ai trouvé la solution sous la forme:

user.sort(function(a,b){
   if (!b.isActive) {
        return -1;
    } else if (b.isActive) {
        return 1;
    }
    return 0;
});


5 commentaires

Votre fonction de tri doit être antisymétrique et transitive. En particulier, si a et b sont tous les deux actifs ou tous deux inactifs, vous devez renvoyer 0.


Merci !, le problème maintenant est que parfois l'objet n'aura pas la propriété isActive, comment peut-on y remédier?


vérifier l'existence au démarrage, si la propriété n'existe pas retourner 0.


@ren Non, ne renvoie pas zéro. Cela violerait la transitivité. (vrai


@RaymondChen: oui je suis d'accord.



1
votes

c'est plus court

user.sort(function(a, b) {
  return b.isActive - a.isActive
})

opération arithmétique sur booléen contraint booléen à entier (1 pour vrai et 0 pour faux) et si la fonction de comparaison retourne négative, a précède b. Si a est vrai et b est faux, a sera placé avant b. Si b est vrai et a est faux, b est placé avant a.


0 commentaires

0
votes

Essayez ceci, j'espère que cela vous aidera. Merci

var user = [{name: 'name1', isActive: false}, {name: 'name2', isActive: false}, {name: 'name3', isActive: true}, {name: 'name4', isActive: false}, {name: 'name9', isActive: true}, {name: 'name8', isActive: false}];

user.sort(function(x, y) {
  return (x.isActive === y.isActive)? 0 : x.isActive? -1 : 1;
});


0 commentaires

0
votes

Veuillez l'utiliser, merci

var user = [
{
    name: 'name1', isActive: false
}, 
{
    name: 'name2', isActive: false
}, 
{
    name: 'name3', isActive: true
},
{
    name: 'name4', isActive: false
},
{
    name: 'name9', isActive: true
},
{
    name: 'name8', isActive: false
}
];
let sortedUser = user.sort(function(a,b){
   if (!b.isActive) {
        return -1;
    } else if (b.isActive) {
        return 1;
    }
    return 0;
});
console.log("Sorted", sortedUser);


0 commentaires

1
votes

var user = [{name: 'name1', isActive: false}, {name: 'name2', isActive: false}, {name: 'name3', isActive: true}, {name: 'name4', isActive: false}, {name: 'name9', isActive: true}, {name: 'name8', isActive: false}];

user.sort(function(a, b){return b.isActive - a.isActive;});
console.log(user);


0 commentaires

0
votes

Je n'aime pas utiliser - entre deux booléens, ma solution serait comme ça, aussi cela fonctionne bien avec l'absence de propriété isActive.

var users = [{name: 'name1', isActive: false}, {name: 'name2', isActive: false}, {name: 'name3', isActive: true}, {name: 'name4', isActive: false}, {name: 'name8', isActive: true}, {name: 'name9', isActive: false}, {name: 'name10'}];

users.sort(function(l, u) {
    var lv = l.isActive ? 1 : 2, uv = u.isActive ? 1 : 2;
    return lv - uv;
});

console.log(users);


0 commentaires

0
votes

La solution la plus simple à votre problème est: user.sort ((a, b) => b.isActive)

Ici, si l'objet n'a pas la propriété isActive, il supposera que la propriété est false par défaut. J'espère que cela aide :)


0 commentaires