Emilio
Emilio

Reputation: 1364

Getting "typeError" "is not a function" when using .length

Here is my code:

function permAlone(string) {
  if (string.length < 2) return string; // This is our break condition

  var permutations = []; // This array will hold our permutations

  for (var i = 0; i < string.length; i++) {
    var character = string[i];

    // Cause we don't want any duplicates:
    if (string.indexOf(character) != i) // if char was used already
      continue; // skip it this time

    var remainingString = string.slice(0, i) + string.slice(i + 1, string.length); //Note: you can concat Strings via '+' in JS

    for (var subPermutation of permAlone(remainingString))
      permutations.push(character + subPermutation);

  }

  var permutationsFinal = [];
  for (var j = 0; j < (permutations.length); j++) {
    if (!(permutations[j].match(/([a-zA-Z])\1/))) {
      permutationsFinal.push(permutations[j]);
    }
  }

  return (permutationsFinal.length);
  //                       ^^^^^^^^ if I add this, the error is thrown
}

permAlone('abc');

If I replace:

return (permutationsFinal);

by:

return (permutationsFinal.length);

I get this error in the console:

TypeError: permAlone is not a function

Why?

Thanks for your help! :)

Upvotes: 5

Views: 1406

Answers (2)

aduss
aduss

Reputation: 556

It is a recursive function, if you return anything other than what is expected by the function itself then you will break the recursive loop.

Upvotes: 3

traktor
traktor

Reputation: 19344

To remove an answer from comment:

for (var subPermutation of permAlone(remainingString)) iterates over the return value of the function (called recursively). It's the line number of the error. Numbers are not iterable, so when you return a number instead of an array it throws an error.

Not sure what browser you are using, but FireFox reports the error as

TypeError: permAlone(...) is not iterable

which is more or less self explanatory. If the error message reported in your browser is for the code posted, it is arguably not just misleading but factually incorrect.

Upvotes: 3

Related Questions