0
votes

La comparaison de la valeur de deux matrices, tandis que la valeur de la propriété est indéfinie

J'essaie de trier un tableau de matrices. Le tri fonctionne la fonction de travail, sauf lorsque la valeur de la propriété est indéfinie.

Par exemple:

Posts Array =

{id: "1", contenu: "Test", "goûts": [{"user_id": "2", "nom_utilisateur": "Test"}]},

{id: "2", contenu: "Test", "goûts": [{"user_id": "2", "nom_utilisateur": "Test"}, {"user_id:" 3 "," nom_utilisateur ":" thé "}]},

{id: "3", contenu: "Test"}

Lorsque j'essaie de trier le tableau en utilisant la fonction ci-dessous:

posts.sort ((a, b) => {return (b.likes.length) - (a.likes.length)})

Cela fonctionne bien, s'il n'y a pas de tableau avec (likes.lenghth) comme non défini.

Cependant, lorsque la troisième matrice est incluse, je reçois l'erreur (ne peut pas lire la «longueur» de la propriété non définie).

Il y a un moyen de résoudre toujours la matrice de cette manière, tandis que le paramètre est toujours manquant est quelques-uns des tableaux?

Merci d'avance


0 commentaires

3 Réponses :


0
votes

Oui, vous devez simplement être explicite dans votre fonction de tri sur la manière de gérer ces scénarios. Voici un exemple simplifié qui utilise une expression courte-circulaire pour tester si a.likes code> et b.likes code> existe.

p>

const posts = [{ likes: [1] }, { likes: [1, 2, 3]}, {}];

posts.sort((a, b) => {
  const aLikes = a.likes ? a.likes.length : 0;
  const bLikes = b.likes ? b.likes.length : 0;
  return bLikes - aLikes;
});

console.log(posts);


2 commentaires

Bien que cela ne jette pas une erreur en raison de la nature de court-circuit. Gardez à l'esprit que const alikes = a.likes && a.likes.length; sets alikes à non défini si a ne possède pas le aime attribut. La même chose pour B . Entraînant une valeur de retour de nan pour quelque chose par rapport à un post sans goûts.


merci mon pote pour votre contribution ... je crains que cela ne fonctionnait pas dans mon repo



0
votes

Je pense que la validation de l'objet n'est pas indéfini et renvoie une valeur min / max lorsque la condition soit fausse.

posts.sort((a,b) => {       
     return (b.likes && a.likes)?(b.likes.length ) -(a.likes.length):-1
   }
);


1 commentaires

merci mon pote pour votre contribution ... je crains que cela ne fonctionnait pas dans mon repo



0
votes

vous où presque là-bas. Vous pouvez simplement simplement par défaut à un tableau vide si l'attribut n'est pas présent (FALSY doit être exact).

p>

const posts = [
  {id: "1", content: "test", likes: [{user_id: "2", user_name: "test"}]},
  {id: "2", content: "test", likes: [{user_id: "2", user_name: "test"}, 
                                     {user_id: "3", user_name: "tea" }]},
  {id: "3", content: "test"}
];

console.log(
  posts.sort((a, b) => (b.likes || []).length - (a.likes || []).length)
);


0 commentaires