Searching for Instance of Item in Nested Array

Hello, I am attempting to check every level of my nested array for the instance of a specific item (in this case; 11).

So firstly I would like to ask why my code is being thrown out of whack at the ‘if’ conditional.

Secondly, is there a better way to do this without nesting loops?

Regards, :slight_smile:

const arr2 = [[11, 12, 13], [14, 11, 15, 16], [17, 11], [18, 11], [19, 11], [[110, 11], [111, [112, 113, 11], 11], 11], 11];

function isItemOmnipresent(arrayOfArrays, item) {
  
  for (let i = 0; i < arrayOfArrays.length; i++) {
    for (let j = 0; j < arrayOfArrays[i].length; j++) {
      for (let k = 0; k < arrayOfArrays[i][j].length; i++) {
        if (arrayOfArrays[i][j][k].indexOf(item) == -1) {
          return false;
        }
      }
    }
  }

  return true;
}

console.log( isItemOmnipresent(arr2, 11) );

k++? :wink: :thinking:

Haha, thank you, but it’s still getting thrown at my ‘if’ conditional with…

TypeError: arrayOfArrays[i][j][k].indexOf is not a function

You are using the wrong algorithm. You have to assume you will not know how many dimensions the starting array (the argument passed to the function) is and account for that in your logic. Your current logic assumes that each element of the first array (an array) has another array in it, but that is not the case. Look the first element [11, 12, 13], it only contains numbers and not arrays.

1 Like

I’m struggling to think how to go about this. Could you point me in the right direction incase it’s something I’ve never seen before. I have tried google first, but I don’t think the questions raised online match exactly.

Am I supposed to be using recursion here? I’m really faltering on this one.

By the way, thanks for your speedy help today. I start a programming course on Monday and you’ve been a great aid :+1:

Recursion would probably be easier logic. What is the actual goal of the function? Is it to return true if at least one instance of the item is found in the array passed as the first argument? If so, you should definitely return true as soon as it is found and only return false once all elements of all arrays have been iterated through.

I want to check if an item (in my case the number 11) is present within both the outer array and each nested array within it. It should only return false if at least one array does NOT have the specified item.

Okay, so here’s where I’m at. I am trying to use recursion, but failing somewhat.

I am getting a return of ‘true’ even when I remove ‘11’ from the first nested array.

Please help :slight_smile:

const arr2 = [[12, 12, 13], [14, 11, 15, 16], [17, 11], [18, 11], [19, 11], [[110, 11], [111, [112, 113, 11], 11], 11], 11];

function isItemOmnipresent(arrayOfArrays, item) {

  for (let i = 0; i < arrayOfArrays.length; i++) {
    if (!arrayOfArrays.includes(11)) {
      return false;
    } else if (Array.isArray(arrayOfArrays[i])) {
      isItemOmnipresent(arrayOfArrays[i]);
    }
  }

  return true;
}

console.log( isItemOmnipresent(arr2, 11) );

Recursion needs a base case.
What is yours?

Also, to recurse you must progressively make the problem set smaller. As this is an array of arrays problem set, I think you have to be careful with how the problem gets smaller.

Isn’t my base case that it will exit the loop if ‘11’ is not included in the targeted array?

What if I give you an empty array?

Then it wouldn’t include ‘11’ and therefor the base call would take effect, no?

in the current version of the code, no?
(try it? maybe i’m wrong)

1 Like

I nested an empty array in there and I’m still getting “true” as a return.

I think I’ve stared at this too long now. I just need a solution at this point, if anyone would be so kind.

all I can do from here is suggest ideas for you (that may move you forward, ideally).

So you know that calling the function with [] should give false.
Why don’t you start there.
Then on a piece of paper, try to figure out some psuedocode that you believe will work. You can share the pseudocode for feedback first before coding…

Pppffft. Feeling completely downbeaten on this one. Can’t bare to look at it anymore.

Will just have to give it a miss if I can’t get an answer from anywhere. Hopefully someone can help me out on here with a solution, because it’s not for a lack of trying.

Cheers, though :+1:

We do not share code solutions in the forum, but if you insist you can always search online for similar problems and their solutions.

Mod edit: solution removed

Hi there, please be aware, we don’t share solutions of fCC challenges on here.

oh, i did not know it was a fCC challenge code,
i thought it was just a problem in hi regular code life,