Understand Nested Loops

Hello, I can’t understand how to do exercise 4 https://www.codecademy.com/practice/projects/credit-card-checker

My code:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        const valid1 = [4, 5, 3, 9, 6, 7, 7, 9, 0, 8, 0, 1, 6, 8, 0, 8];
const valid2 = [5, 5, 3, 5, 7, 6, 6, 7, 6, 8, 7, 5, 1, 4, 3, 9];
const valid3 = [3, 7, 1, 6, 1, 2, 0, 1, 9, 9, 8, 5, 2, 3, 6];
const valid4 = [6, 0, 1, 1, 1, 4, 4, 3, 4, 0, 6, 8, 2, 9, 0, 5];
const valid5 = [4, 5, 3, 9, 4, 0, 4, 9, 6, 7, 8, 6, 9, 6, 6, 6];

// All invalid credit card numbers
const invalid1 = [4, 5, 3, 2, 7, 7, 8, 7, 7, 1, 0, 9, 1, 7, 9, 5];
const invalid2 = [5, 7, 9, 5, 5, 9, 3, 3, 9, 2, 1, 3, 4, 6, 4, 3];
const invalid3 = [3, 7, 5, 7, 9, 6, 0, 8, 4, 4, 5, 9, 9, 1, 4];
const invalid4 = [6, 0, 1, 1, 1, 2, 7, 9, 6, 1, 7, 7, 7, 9, 3, 5];
const invalid5 = [5, 3, 8, 2, 0, 1, 9, 7, 7, 2, 8, 8, 3, 8, 5, 4];

// Can be either valid or invalid
const mystery1 = [3, 4, 4, 8, 0, 1, 9, 6, 8, 3, 0, 5, 4, 1, 4];
const mystery2 = [5, 4, 6, 6, 1, 0, 0, 8, 6, 1, 6, 2, 0, 2, 3, 9];
const mystery3 = [6, 0, 1, 1, 3, 7, 7, 0, 2, 0, 9, 6, 2, 6, 5, 6, 2, 0, 3];
const mystery4 = [4, 9, 2, 9, 8, 7, 7, 1, 6, 9, 2, 1, 7, 0, 9, 3];
const mystery5 = [4, 9, 1, 3, 5, 4, 0, 4, 6, 3, 0, 7, 2, 5, 2, 3];

// An array of all the arrays above
const batch = [valid1, valid2, valid3, valid4, valid5, invalid1, invalid2, invalid3, invalid4, invalid5, mystery1, mystery2, mystery3, mystery4, mystery5];


// Add your functions below:
function validateCred(array) {
  emptyArray = [];
  everyOther = [];
  everyAnother = [];
  sumArray = [];
  
 
  for (let b=0; array.length > b; b++) {
    for (let i=array.length-1; i >= 0; i--) {
    emptyArray.push(array[b][i]);
  }
  }
  for (let k=0; array.length > k; k++) {
  for (let j=1; j < emptyArray.length; j += 2) {
    everyOther.push(emptyArray[k][j]);
  } 
  }
  for (let o=0; array.length > o; o++) {
  for (let x=0; x < emptyArray.length; x +=2){
    everyAnother.push(emptyArray[o][x]);
    sumArray.push(emptyArray[o][x]);
  }
  }
  modified = everyOther.map(function multiply(s){
    let multiplied = s*2;
    if (multiplied > 9){
    return sumArray.push(multiplied-9)
    }else{
      return sumArray.push(multiplied);
    }
  })
  console.log(typeof modified)
  
  let sum = sumArray.reduce((a, b) => a+b, 0);
  if(sum%10 == 0) {
    console.log("credit card number is valid")
  }else {
    console.log("credit card number is invalid")}
  return [emptyArray, everyOther, everyAnother, sumArray, sum];
}


console.log(validateCred(batch))

    </script>
</body>
</html>
1 Like

Thanks for sharing @ramutis!

Let’s break it down, what’s the first part you don’t get?

How to make sumArray nested by pushing all those
for loops?

Specifically everyOther and everyAnother

Try commenting out all the console.logs.

Then wrap logs around everyOther to see how it works, and what you need to make it work. (check MDN documentation for tips about the core nature of the method).

google chrome doesnt show from where the output comes do you know any other way?

check the console :slight_smile:

logged everyOther, says undefined. And I assume you meant me to comment console.logs to make me
understand that they need a for loop also. Correct?

i meant if you’re opening on the chrome browser you can check its console (with right click i think) if you want to see it like that

Yeah but before. What you meant

Well, if it’s returning undefined it’s probably because of something you’re doing in the implementation that’s not creating the desired effect (just giving hints here, remember!).

So one place to check would be the MDN documentation for hints for how you’re mapping every other (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)

why modified is an object? If it should return an array?

Didn’t want to use arrow syntax

What is the type of an array?

console.log(typeof 'hi')
console.log(typeof [1,2,3])

I don’t know.llllllllllllllllllllllll

object, but i’m new to programming

1 Like

Right, I’m trying to walk you through the thinking process.

So if I want to verify types, I would do a check on a simple array like [1,2,3]. As you said, it’s not always so intuitive to think the type is going to be object (for example, in python, if you ask for type([1,2,3]), you get class list.

All this to say, is that modified should be returning an object indeed! That object should be an array. There’s a method called isArray() to ask the machine if an object is an array, specifically.

This process of figuring out what things are is essentially what gives you the foundations to being a good programmer. It’s ok, it’s hard for all of us.

1 Like

But do you understand? :slightly_smiling_face: I wanted to make a nested array and I dont have any idea how to return it.

function validateCred(array) {
  emptyArray = [];
  everyOther = [];
  everyAnother = [];
  sumArray = [];
  
 
  for (let b=0; array.length > b; b++) {
    for (let i=array.length-1; i >= 0; i--) {
    emptyArray.push(array[b][i]);
  }
  }
  for (let k=0; array.length > k; k++) {
  for (let j=1; j < emptyArray.length; j += 2) {
    everyOther.push(emptyArray[k][j]);
  }
  
  }
  for (let o=0; array.length > o; o++) {
  for (let x=0; x < emptyArray.length; x +=2){
    everyAnother.push(emptyArray[o][x]);
    sumArray.push(emptyArray[o][x]);
  }
  }
  for (let l=0; array.length > l; l++){
  modified = everyOther.map(function multiply(s){
    let multiplied = s*2;
    if (multiplied > 9){
    return sumArray.push(multiplied-9)
    }else{
      return sumArray.push(multiplied);
    }
  })}
  console.log(typeof modified)
  let sum;
  for (let u=0; array.length > u; u++) {
  sum = sumArray.reduce((a, b) => a+b, 0);
  if(sum%10 == 0) {
    console.log("credit card number is valid") //this console log says valid if sum%10 == 0
  }else {
    console.log("credit card number is invalid")}
    }
  return [emptyArray, everyOther, everyAnother, sumArray, sum];
}


console.log(validateCred(batch))

Yes, I know. For any bigger process it’s important to know how the little pieces work. You mentioned your everyOther method wasn’t working so I focused on that first (you can’t nest and return properly if the methods aren’t working like you want them to).

If you’re just worried about nesting, try nesting small arrays (size 3 or 4) and play with returning those.

A classs method,

Array.isArray(arr)
1 Like