Ich versuche mit funktionaler Programmierung zu arbeiten

Ich habe zwei Arrays

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

Mit einer Kombination von

filtern, abbilden, einige, Funktionen reduzieren

Ich möchte Elemente aus arr2 extrahieren

where arr2.id === arr1.prodId 

Meine Ausgabe arr wäre:

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

Ich versuche, forEach zu vermeiden und funktionale Programmierung zu verwenden.

2
ir2pid 18 Jän. 2019 im 14:43

3 Antworten

Beste Antwort

Sie sollten die Methode filter in Kombination mit includes und map verwenden.

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);

Ein anderer Ansatz ist die Verwendung der Methode some.

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);
5
Mihai Alexandru-Ionut 18 Jän. 2019 im 11:49

Lösungen, die .includes, .find oder .some verwenden, sind Array-Operationen und kosten lineare Zeit. Bei Verwendung innerhalb von .filter, einer anderen linearen Zeitoperation, ist das Ergebnis eine quadratische Zeitberechnung. Wenn die Eingabelisten groß sind, ist diese Auswirkung nicht unerheblich.

Sammeln Sie stattdessen zuerst die IDs, die in einem Set übereinstimmen sollen, und nutzen Sie dann die konstante Zeitsuche in filter -

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" } ]
1
Thank you 18 Jän. 2019 im 17:19

Suchst du danach.

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)
1
Shubh 18 Jän. 2019 im 12:01