javascript - 如何跳过两个相同数组索引之间的比较?

标签 javascript html css arrays data-structures

我正在做这个非常简单的 codewars kata 下面是问题所在:

An isogram is a word that has no repeating letters, consecutive or non-consecutive. Implement a function that determines whether a string that contains only letters is an isogram. Assume the empty string is an isogram. Ignore letter case.

function isIsogram(str){
  var letter = str.toLowerCase().split("");

  for(var i = 0; i < letter.length; i++) {
    if(letter.indexOf(letter[i].toLowerCase()) > -1){
      return false;
    }
  }
  return true; 
}

我的解决方案总是返回 false,因为我在 indexOf 中的数组比较了我的字符串中的每个字母。该解决方案应该将数组与自身进行比较,如果没有重复字母则返回 true。但对我来说不幸的是,当将数组与自身进行比较时,它会将数组中的每个字母与自身进行比较,所以基本上即使数组中只有该字符的一个字母,因为它再次与自身进行比较,它将返回虚假陈述。

这个问题让我很苦恼。

最佳答案

检查 Array#lastIndexOf (它从末尾搜索)与当前索引相同。如果不是,则它不是唯一的:

function isIsogram(str){
  var letter = str.toLowerCase().split("");

  for(var i = 0; i < letter.length; i++) {
    if(letter.lastIndexOf(letter[i]) !== i){
      return false;
    }
  }
  return true; 
}

console.log(isIsogram('subdermatoglyphic'));
console.log(isIsogram('rare'));

更好的解决方案是使用 Set 来比较唯一字符的数量与原始字符串中的字符数:

const isIsogram = (str) => new Set(str.toLowerCase()).size === str.length;

console.log(isIsogram('subdermatoglyphic'));
console.log(isIsogram('rare'));

关于javascript - 如何跳过两个相同数组索引之间的比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46655421/

相关文章:

javascript - 如何使用从异步函数接收的数据在 Ajax 调用中返回 bool 值

python - 使用python用HTML表单 "fillable pdf"数据填写 "post"?

javascript - 如何在 <td></td> 的每四个循环项之后添加 <tr></tr>

javascript - 如何单击孙子元素而不同时单击其祖 parent ?

css - 为什么包含在 float div 之后的 div 中的文本出现错位?

javascript - 让javascript在任何链接上工作

javascript - 滚动时修复/取消修复 Div

javascript - 为什么 Firefox 会报语法错误,class is a reserved identifier?

javascript - Plupload 在 ipad 上无法工作

javascript - 从 Javascript 响应对象中提取 YQL 查询内容