Jump to content

JAVASCRIPT - Where is the array mutation happening?!?

duckypath
Go to solution Solved by 0x21,
// Add your functions below:
const validateCred = arr => {
  ...
    doubleDigit = arr[i] *= 2;
  ...
}

const findInvalidCards = batchArr => {
  ...
      invalidCards.push(invalid1);
  ...
}

//console.log(findInvalidCards(batch));
console.log(findInvalidCards(batch));

You are using multiplication assignment, where I think you just want multiplication.

 

Also, you are always pushing `invalid1` to your `invalidCards` array, as opposed to the specific card you are validating for that iteration.

// All valid credit card numbers
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:
const validateCred = arr => {
  let newArr = [];
  let doubleDigit;
  newArr.unshift(arr[arr.length - 1]);
  for (let i = arr.length - 2; i > 0; i--) {
    doubleDigit = arr[i] *= 2;
    newArr.unshift(doubleDigit);
    //newArr.unshift(arr[i] *= 2);
    newArr.unshift(arr[i - 1]);
    i--;
  }
  if (arr.length > 15) {
    newArr.unshift(arr[0] * 2);
  }
  for (let j = 0; j <= newArr.length - 1; j++) {
    if (newArr[j] > 9) {
      newArr[j] -= 9;
    } else {
      newArr[j];
    }
  }
  let finalSum = newArr.reduce((a,b) => a + b, 0);
  if (finalSum % 10 === 0) {
    return true;
  } else {
    return false;
  }
}

const findInvalidCards = batchArr => {
  let invalidCards = [];
  for (let i = 0; i <= batchArr.length - 1; i++) {
    if (validateCred(batchArr[i]) === false) {
      invalidCards.push(invalid1);
    }
  }
  return invalidCards;
}

//console.log(findInvalidCards(batch));
console.log(findInvalidCards(batch));






 

Project from Codecademy, and I am stuck on the function validateCred(). Somewhere that function is mutation the original arrays, even though all values are being pushed to the new array newArr, and arr isn't being touched. With that said, it could be that newArr is referencing arr? Or some of my array methods are mutating the original arrays, but I can't find out where. The out put is:

 

[ [ 4, 5, 6, 2, 14, 7, 16, 7, 14, 1, 0, 9, 2, 7, 18, 5 ],
  [ 4, 5, 6, 2, 14, 7, 16, 7, 14, 1, 0, 9, 2, 7, 18, 5 ],
  [ 4, 5, 6, 2, 14, 7, 16, 7, 14, 1, 0, 9, 2, 7, 18, 5 ],
  [ 4, 5, 6, 2, 14, 7, 16, 7, 14, 1, 0, 9, 2, 7, 18, 5 ],
  [ 4, 5, 6, 2, 14, 7, 16, 7, 14, 1, 0, 9, 2, 7, 18, 5 ],
  [ 4, 5, 6, 2, 14, 7, 16, 7, 14, 1, 0, 9, 2, 7, 18, 5 ],
  [ 4, 5, 6, 2, 14, 7, 16, 7, 14, 1, 0, 9, 2, 7, 18, 5 ],
  [ 4, 5, 6, 2, 14, 7, 16, 7, 14, 1, 0, 9, 2, 7, 18, 5 ] ]

 

Which is what I need, except that the double digits that were added were not supposed to be returned. The original values were supposed to be returned.

Link to comment
Share on other sites

Link to post
Share on other sites

// Add your functions below:
const validateCred = arr => {
  ...
    doubleDigit = arr[i] *= 2;
  ...
}

const findInvalidCards = batchArr => {
  ...
      invalidCards.push(invalid1);
  ...
}

//console.log(findInvalidCards(batch));
console.log(findInvalidCards(batch));

You are using multiplication assignment, where I think you just want multiplication.

 

Also, you are always pushing `invalid1` to your `invalidCards` array, as opposed to the specific card you are validating for that iteration.

Link to comment
Share on other sites

Link to post
Share on other sites

51 minutes ago, 0x21 said:

// Add your functions below:
const validateCred = arr => {
  ...
    doubleDigit = arr[i] *= 2;
  ...
}

const findInvalidCards = batchArr => {
  ...
      invalidCards.push(invalid1);
  ...
}

//console.log(findInvalidCards(batch));
console.log(findInvalidCards(batch));

You are using multiplication assignment, where I think you just want multiplication.

 

Also, you are always pushing `invalid1` to your `invalidCards` array, as opposed to the specific card you are validating for that iteration.

 

Wow! Totally missed the multiply assign! Thank you!!!! The invalid1 being pushed was actually a debug test I forgot to revert before posting code, but thank you for that as well.

Link to comment
Share on other sites

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×