3
votes

Comment mapper avec un conditionnel en Javascript

Je traverse un tableau d'objets:

  const peopleAvailable = people.map(person.available => person.value);

Je veux que ma sortie soit les noms de ceux disponibles:

  const peopleAvailable = people.map(person => person.value);

Je sais actuellement comment cartographier et extraire pour un champ. Comment ajouter le conditionnel?

["Sally"]

Vous voulez faire quelque chose comme ça:

people = [
  {id:1, name:"Bob", available:false},
  {id:2, name:"Sally", available:true},
  {id:1, name:"Trish", available:false},
]


0 commentaires

3 Réponses :


1
votes

Vous ne pouvez pas mapper conditionnellement avec la fonction .map() seule, mais vous pouvez utiliser .filter() pour obtenir ce dont vous avez besoin.

L'appel de filter renverra un nouveau tableau où chaque élément du nouveau tableau répond à vos critères de filtrage (c'est-à-dire people.available === true ).

Dans le cas de votre code, vous pouvez directement enchaîner le filtre avec votre appel existant à .map() pour obtenir le résultat souhaité:

const people = [{
    id: 1,
    name: "Bob",
    available: false
  },
  {
    id: 2,
    name: "Sally",
    available: true
  },
  {
    id: 1,
    name: "Trish",
    available: false
  },
];

const peopleAvailable = people
.filter(people => people.available)    /* filter available people */
.map(person => person.name)            /* map each person to name */ 

console.log(peopleAvailable);


4 commentaires

J'essaie de filtrer par disponible, serait-ce correct? const peopleAvailable = people.map (person => person.value) .filter (person => person.available);


@NinaScholz pense que vous voyez une ancienne modification - "entrée de tabulation" accidentelle


c'est logique. Merci. Est-ce que .filter (people => people.available) fonctionne également? Je me demande si je dois ajouter le "===" pour ce conditionnel booléen


@ lost9123193 oui vous pouvez omettre le === true dans ce cas, je mettrai à jour la réponse



1
votes

Essayer

people = [
  {id:1, name:"Bob", available:false},
  {id:2, name:"Sally", available:true},
  {id:1, name:"Trish", available:false},
];

let r = people.reduce((a,c) => a.concat(c.available ? c.name:[]), [])

console.log(r);

people.reduce((a,c) => a.concat(c.available ? c.name:[]), [])


0 commentaires

0
votes

Vous ne pouvez pas vérifier la condition dans map() . Si vous mettez des conditions, les autres éléments seront renvoyés comme undefined . Vous pouvez gérer cela en appliquant filter() qui vous permet de ne renvoyer que les éléments qui tombent dans votre condition. Vous devez donc utiliser filter() puis utiliser map() sur le résultat filtré.

const array = [{
    id: 1,
    name: "Bob",
    available: false
  },
  {
    id: 2,
    name: "Sally",
    available: true
  },
  {
    id: 1,
    name: "Trish",
    available: false
  },
];

const withFilter = array
.filter((r) => { return r.available; })
.map((m) => { return m.name; });                

console.log(withFilter);

const withOutFilter = array
.map((m) => { if(m.available) { return m.name; } });                

console.log(withOutFilter);


0 commentaires