2
votes

Filtrer le tableau dans Typescript en utilisant la programmation fonctionnelle [filtrer, mapper, certains, réduire etc.]

J'essaye de travailler avec la programmation fonctionnelle

J'ai deux tableaux

  [{id:2, name:"Test2"},
  {id:4, name:"Test4"}]

en utilisant une combinaison de

Filtrer, cartographier, certaines, réduire les fonctions

Je veux extraire des éléments de arr2

where arr2.id === arr1.prodId 

ma sortie arr serait:

arr1=[{prodId:2}{prodId:4}]

arr2=[{id:1, name:"Test1"},
      {id:2, name:"Test2"},
      {id:3, name:"Test3"},
      {id:4, name:"Test4"},
      {id:5, name:"Test5"}]

J'essaye d'éviter forEach et d'utiliser la programmation fonctionnelle.


0 commentaires

3 Réponses :


5
votes

Vous devez utiliser la méthode filter en combinaison avec includes et map.

let arr1=[{prodId:2},{prodId:4}], arr2=[{id:1, name:"Test1"}, {id:2, name:"Test2"}, {id:3, name:"Test3"}, {id:4, name:"Test4"}, {id:5, name:"Test5"}];

let result = arr2.filter(({id}) => arr1.some(({prodId}) => prodId == id));
console.log(result);

Une autre approche consiste à utiliser une méthode.

let arr1=[{prodId:2},{prodId:4}], arr2=[{id:1, name:"Test1"}, {id:2, name:"Test2"}, {id:3, name:"Test3"}, {id:4, name:"Test4"}, {id:5, name:"Test5"}];
let ids = arr1.map(({prodId}) => prodId);
let result = arr2.filter(({id}) => ids.includes(id));
console.log(result);


2 commentaires

Vous pouvez extraire la fonction interne map pour éviter de calculer l'opération à chaque itération.


L'approche certains est préférée IMO, l'intention est plus claire que la version inclut .



1
votes

Est-ce ce que vous recherchez.

arr1=[{prodId:2},{prodId:4}]

arr2=[{id:1, name:"Test1"},
      {id:2, name:"Test2"},
      {id:3, name:"Test3"},
      {id:4, name:"Test4"},
      {id:5, name:"Test5"}]


      

    let k=arr2.reduce((o,a)=>{
      if(arr1.map(a=>a.prodId).indexOf(a.id)!=-1)
      {
         o.push(a)
      }
        return o;
      },[])
console.log(k)


0 commentaires

2
votes

Les solutions utilisant .includes , .find ou .some sont des opérations de tableau et coûtent un temps linéaire. Lorsqu'il est utilisé dans .filter , une autre opération de temps linéaire, le résultat est un calcul de temps quadratique. Si les listes d'entrée sont volumineuses, cet impact n'est pas insignifiant.

Au lieu de cela, collectez d'abord les identifiants à faire correspondre dans un ensemble, puis profitez de la recherche en temps constant dans le filtre -

const arr1 = 
  [ { prodId: 2 }
  , { prodId: 4 }
  ]

const arr2 =
  [ { id:1, name:"Test1" }
  , { id:2, name:"Test2" }
  , { id:3, name:"Test3" }
  , { id:4, name:"Test4" }
  , { id:5, name:"Test5" }
  ]
      
const find = (whitelist, list) =>
{ const ids =
    new Set (whitelist.map(x => x.prodId)) // create a set
    
  return list.filter(x => ids.has(x.id)) // Set#has uses constant time
}

console.log(find(arr1,arr2))
// [ { id: 2, name: "Test2" }, { id: 4, name: "Test4" } ]


0 commentaires