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.
3 Réponses :
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);
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
.
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)
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" } ]