javascript - Cum pot să obțin obiecte dintr-un array cu un id specific comparat cu numerele din alt array


Trebuie să compar un array de obiecte id din firstArray cu array-ul de numere (secondArray) și să returnez un array nou cu obiectele din primul array ale căror id-uri există în al doilea array.

Deci, la final, vreau un nou array cu obiecte cu id-urile 39 și 41.

De fapt, găsesc ceva de genul acesta:

const result = arr2.filter(o => arr1.find(x => x.id === o));
const arr1 =
"blocks": [
    {
      "id": 1,
      "functions": [ 0, 1 ]
    },
    {
      "id": 39,
      "functions": [ 0, 1, 3, 4 ]
    },
    {
      "id": 41,
      "functions": [ 0, 1 ]
    }
]
const arr2 = [39, 41]

Răspuns #1

Poți folosi funcția includes() în timpul filtrării. Includes() funcționează ca funcția in array.

const arr1 =
 [ {
      "id": 1,
      "functions": [ 0, 1 ] },
    {
      "id": 39,
      "functions": [ 0, 1, 3, 4 ]
    },
    {
      "id": 41,
      "functions": [ 0, 1 ]
    }
]

const arr2 = [39, 41]
const result = arr1.filter(o => arr2.includes(o.id));

console.log(result)

Răspunsul #2

Poți crea un Map pentru a vedea dacă există un element în Map în array-ul filtrat. Obținerea unui element din metoda Map este O(1):

const blocks = [
{
  "id": 1,
  "functions": [
    0,
    1
  ]
},
{
  "id": 39,
  "functions": [
    0,
    1,
    3,
    4
  ]
},
{
  "id": 41,
  "functions": [
    0,
    1
  ]
}
];

const arr2 = [39, 41];
const arr2Maps = new Map(arr2.map(a=>[a, a]));
const result = blocks.filter(o => arr2Maps.get(o.id));
console.log(result)

În plus, poți folosi metodele filter și some. Totuși, metoda some are O(n):

const blocks = [
    {
      "id": 1,
      "functions": [
        0,
        1
      ]
    },
    {
      "id": 39,
      "functions": [
        0,
        1,
        3,
        4
      ]
    },
    {
      "id": 41,
      "functions": [
        0,
        1
      ]
    }
];

const arr2 = [39, 41]

const result = blocks.filter(o => arr2.some(a=> a ==o.id ));    
console.log(result)