Home > Software engineering >  How can we use Array.prototype.map on strings?
How can we use Array.prototype.map on strings?

Time:09-12

I know we can't use Array.prototype.map on strings like

const str = 'MY NAME IS USER';
const result = str.map(c => c); // "Uncaught TypeError: str.map is not a function"
console.log(result);

This will result in error states:

"Uncaught TypeError: str.map is not a function"

But today I came across a code snipet where I can use call Array.prototype on strings

const str = 'MY NAME IS USER';

const x = Array.prototype.map
  .call(str, (c, i) => {
    if (str.indexOf(c, i   1) == -1 && str.lastIndexOf(c, i - 1) == -1)
      return c;
  })
  .join('');

console.log(x);

In this snippet I couldn't get how Array.prototype.map called on string str.

CodePudding user response:

Object methods work with this. The map function is implemented something like:

function map(cb) {
    var r = [];
    for (var i = 0; i < this.length; i  ) {
         r.push(cb(this[i]));
    }
    return r;
}

When you invoke a function with .call, you can decide what the this context should be. Even though the this in array methods is usually an array, you're overriding that here. And the way map is implemented—how it uses this—happens to work both for arrays and strings.

CodePudding user response:

@deceze already answered your question. Additional, if you want to use map (or any Array prototype method) 'directly' on a string, spread it:

const str = 'MY NAME IS USER';
const x = [...str].reduce( (a, c) => a.concat(c.toLowerCase()), ``);

console.log(x);

  • Related