Scholli
Scholli

Reputation: 429

Node fast way to find in array

I have a Problem.

My script was working fine and fast, when there was only like up to 5000 Objects in my Array.

Now there over 20.000 Objects and it runs slower and slower...

This is how i called it

    for(var h in ItemsCases) {
        if(itmID == ItemsCases[h].sku) {

With "for" for every object and check where the sku is my itmID, cause i dont want every ItemsCases. Only few of it each time.

But what is the fastest and best way to get the items with the sku i need out of it?

I think mine, is not the fastest...

I get multiple items now with that code

var skus = res.response.cases[x].skus;
for(var j in skus) {
    var itmID = skus[j];
    for(var h in ItemsCases) {
        if(itmID == ItemsCases[h].sku) {

the skus is also an array

Upvotes: 0

Views: 2129

Answers (1)

Amadan
Amadan

Reputation: 198418

ItemsCases.find(item => item.sku === itmID) (or a for loop like yours, depending on the implementation) is the fastest you can do with an array (if you can have multiple items returned, use filter instead of find).

Use a Map or an object lookup if you need to be faster than that. It does need preparation and memory, but if you are searching a lot it may well be worth it. For example, using a Map:

// preparation of the lookup
const ItemsCasesLookup = new Map();
ItemsCases.forEach(item => {
  const list = ItemsCasesLookup.get(item.sku);
  if (list) {
    list.push(item)
  } else {
    ItemsCasesLookup.set(item.sku, [item]);
  }
});

then later you can get all items for the same sku like this:

ItemsCasesLookup.get(itmID);

A compromise (not more memory, but some speedup) can be achieved by pre-sorting your array, then using a binary search on it, which is much faster than linear search you have to do on an unprepared array.

Upvotes: 2

Related Questions