'check that a word is an isogram with pure javascript

How do i check that a given word is an isogram with pure javascript, using a function. the function must return true or false.

An isogram is a word with a repeated character.

I know this code works, but i need a better solution.

function isIsogram(word){
    x = false; y = false;
    for(i = 0; i < word.length; i++){
        wordl = word.substring(0,i)
        wordr = word.substring(i)
        x = wordl.includes(word.charAt(i))
        y = wordr.includes(word.charAt(i))
        //console.log(x,wordl,wordr)
    }
    return x&&y
}
isIsogram("thomas");//False
isIsogram("moses"); //True


Solution 1:[1]

Here is a simple approach using .split() and .every():

let isIsogram = (str) => str.split("").every((c, i) => str.indexOf(c) == i);
                            
console.log(isIsogram("thomas"));   /* no repeating letter */
console.log(isIsogram("moses"));    /* s repeat 2 times */
console.log(isIsogram("hello"));    /* l repeat 2 times */
console.log(isIsogram("world"));    /* no repeating letter */
console.log(isIsogram("a b c"));    /* space character repeat 2 times */

Docs:

Solution 2:[2]

Remove the duplicate letter from string then check both length. if same its an isogram.

function isIsogram(str){
 return str.split('').filter((item, pos, arr)=> arr.indexOf(item) == pos).length == str.length;
}
console.log(isIsogram('thomas'));
console.log(isIsogram('moses'));

Solution 3:[3]

One way of doing this!

function isIsogram(str){
  return !str.match(/([a-z]).*\1/i);
}

Solution 4:[4]

Building on kishea's answer:

function isIsogram(sWord)
 {
  for (iCharIndex = 0; iCharIndex < sWord.length; iCharIndex++)
    if (sWord.substring(iCharIndex + 1).includes(sWord.charAt(iCharIndex)))
      return false;
  return true;
 }

If the character at the current position (charAt) is found (includes) to the right of the current position (substring), false is returned. Otherwise the loop runs to the end and true is returned.

Solution 5:[5]

const isIsogram = (word) => {
    return new Set(word.toLowerCase()).size === word.length
}

console.log(isIsogram('Thor'));//true
console.log(isIsogram('Loki'));//true
console.log(isIsogram('America'));//false

Solution 6:[6]

What about :

> function isIsogram(word) {
... var a = word.split('')
... var b = Array.from(new Set(a))
... return a.length === b.length;
... }
undefined
> isIsogram("mesos")
false
> isIsogram("thomas")
true

Or better (checking each char only once) :

> function isIsogram2(word) {
... for(var i=0,len=word.length-1;i<len;++i) {
..... var c = word[i]
..... if(word.indexOf(c,i+1) !== -1) return false;
..... }
... return true;
... }
undefined
> isIsogram2("mesos")
false
> isIsogram2("thomas")
true

Solution 7:[7]

function isIsogram(word){
   return !/(.).*\1|\d/i.test(word)
}

Solution 8:[8]

var str=prompt('Enter a string');
    var strlen=str.length;

    for(i=0;i<strlen;i++){
       var stc=str.charAt(i);
       var flag=0;
       for(j=0;j<strlen;j++){
        var stk=str.charAt(j);
          if(stc==stk){
            flag=flag+1;
          }
       }

       if(flag!=1){
        break;
       }

    }

    if(flag!=1){
        alert('It is not an isogram');
    }
    else{
        alert('It is an isogram');
    }

Solution 9:[9]

While given a word, this function if splits the word into two, That is wordl and wordr respectively. Both splittings are checked to include a character in the original word. If wordl and wordr both contain any character in the original word. Then surely this is an isogram

function isIsogram(word){
    x = false; y = false;
    for(i = 0; i < word.length; i++){
        wordl = word.substring(0,i)
        wordr = word.substring(i)
        x = wordl.includes(word.charAt(i))
        y = wordr.includes(word.charAt(i))
        //console.log(x,wordl,wordr)
    }
    return !x&&y
}
isIsogram("thomas");//True
isIsogram("moses"); //False

Solution 10:[10]

const isIsogram = (string) => {
    
    const lowerCased = string.toLowerCase()
    
    const result = lowerCased.split('').every((v,i)=>lowerCased.indexOf(v)===i)
    
    return result

}

console.log(isIsogram('ambidExtRously')) // true
console.log(isIsogram('patteRN')) // false

Solution 11:[11]

function isIsogram(word) {

    let uniqueCharacters = new Set(word.split(''));

    uniqueCharacters = Array.from(uniqueCharacters); //get all the unique char

    let charFreq = {}; //e.g {a:2, b:3}

    for (element of uniqueCharacters) {
        charFreq[element] = 0;
    } //set the frequency of each char to zero

    function updateFrequency(element) {
        charFreq[element] += 1;
    }//callback used directly below

    word.split('').forEach(updateFrequency); //for each char encountered, update frequency

    let frequencyOfCharacter = [];

    for (keys in charFreq) {
        frequencyOfCharacter.push(charFreq[keys]);
    }

    function equal(item) {
        return item === frequencyOfCharacter[0];
    }
    //check if all the frequencies are the same, an isogram means all characters occur at the same frequency

    return frequencyOfCharacter.every(equal);
}

console.log(isIsogram('try'), isIsogram('baba'), isIsogram('tests'));

Solution 12:[12]

function isIsogram(str) {
    return new Set(str.toUpperCase()).size == str.length
}