JS - Filtrare array cu array

Am urmatoarele tipuri de array-uri iar pe unul din ele vreau sa le filtrez.

let arr1 = [ { IdClient: 999, IdPlanificare: [1,2,3,4] },  { IdClient: 888, IdPlanificare: [7,8,1] }, { IdClient: 777, IdPlanificare: [4,5,6] }];
let arr2 = [1,8,3];

Incerc sa filtrez arr1 in functie de IdPlanificare cu valorile din arr2, cu alte cuvinte din arr1 am nevoie de obiectele a caror IdClient sunt 999 si 888.

Am incercat sub forma insa fara rezultat:

arr1.filter(item => {
   return item.IdPlanificare.indexOf(arr2.map(val => val)) > -1;
 });

Multumesc!

arr1.filter(item => item.IdPlanificare.filter(id => arr2.includes(id)).length > 0)

Daca am inteles eu bine tu vrei sa filtrezi dupa o intersectie.

1 Like

Am incercat codul tau insa nu merge.

function arrayToMap(arr) {
  const map = {};

  arr.forEach(item => map[item] = true);
  
  return map;
}

const arr2Map = arrayToMap(arr2);

const filtered = arr1.filter(item => {
  for (const idPlanificare of item.IdPlanificare) {
    if (arr2Map[idPlanificare]) {
      return true;
    } 
  }

  return false;
});
1 Like

Structura data exemplu mi s-a parut cunoscuta, si aveam si motiv: Valori distincte dintr-o matrice cu obiecte. In aceeasi ordine de idei postata de @navaru in thread-ul anterior, (in continuare) iti lipseste un minim de cunostinte de baza, fapt care se vede in thread-ul curent.

Ce nu merge? Nu intoarce nimic? Intoarce valori eronat? A luat foc casa?

Codul postat de @foobaz256 este functional, la mijloc fiind vorba de (pe scurt) iteratia prin doua array-uri - arr1, respectiv arr1.*.IdPlanificare, scapam de o a treia iteratie prin arr2 prin Array.prototype.includes().

Parerea mea este ca fie date puse de tine drept exemplu nu corespund cu datele tale - spre exemplu, id-urile din IdPlanificare sau arr2 sunt de tip string, iar tu cauti dupa un int, sau vice-versa.
image

Ce vreau eu sa spun prin gramada asta de cuvinte, este sa incerci in continuare. Sunt lucruri simple, de care te vei lovi restul carierei (daca faci/vei face asta in continuare). Ia-o iterativ, ia-o la mana, si nu mai copia toate raspunsurile de pe net.

let arr1 = [ { IdClient: 999, IdPlanificare: [1,2,3,4] },  { IdClient: 888, IdPlanificare: [7,8,1] }, { IdClient: 777, IdPlanificare: [4,5,6] }];
let arr2 = [1,8,3];

arr1.forEach(item => { // trecem prin arr1, luam obiectele la rand
  console.log({item}); // afisam obiectul curent

  item.IdPlanificare.forEach(idPlanificare => { // trecem prin toate id-urile de planificare
    console.log({idPlanificare, tip: typeof idPlanificare}); // afisam id-ul, cat si tipul lui, poate am sarit peste ceva in consola

    // facem cast "fortat" al id-ului la string prin concatenarea variabilei cu un string gol,
    // si apoi obtinem un numar in baza 10
    let idPlanificareCaNumar = parseInt(idPlanificare + '', 10);

    // verificam daca arr2 contine _fie_ id-ul de planificare asa cum il avem, fie ca numar (obligatoriu)
    if (arr2.includes(idPlanificare) || arr2.includes(idPlanificareCaNumar)) {
      console.log('gasit item', item);
    }
  });
});

Bineinteles, metoda de mai sus va afisa duplicat intrarile daca exista mai multe id-uri planificare corecte, dar este strict ca model educational (console.log, debugging-ul saracului).

4 Likes

Pt deduplicare de poate folosi codul din subiectul anterior al op-ului

Intr-o functie si gata :slight_smile:

function removeDupes(arg) {}