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" } ]