在字符串上使用in循环可以吗?

时间:2019-09-26 20:37:50

标签: javascript for-loop indexof for-in-loop lastindexof

只是想知道是否可以在字符串上使用for in循环。不确定是否会有奇怪的结果或不好的做法,但我的解决方案至少在此示例中有效。

编码练习题。另外,如果有人可以改善我的解决方案,我也乐意为您提供建议。

function firstNonRepeatingLetter(str) {
  const lowerStr = str.toLowerCase();

  for (let char in lowerStr) {
    if (lowerStr.lastIndexOf(lowerStr[char]) === parseInt(char) && 
    lowerStr.indexOf(lowerStr[char]) === parseInt(char)) {
      return str[char];
    }
  }

  return "";
}

编写一个名为first_non_repeating_letter的函数,该函数接受一个string输入,并返回字符串中任何地方都没有重复的第一个字符。

示例:

firstNonRepeatingLetter('a') => 'a'
firstNonRepeatingLetter('stress') => 't'
firstNonRepeatingLetter('sTreSS') => 'T'

6 个答案:

答案 0 :(得分:5)

在您的代码正常工作的同时,我建议使用索引来迭代字符串的字符。

但是您的方法通过使用indexOflastIndexOf将字符串重复很多。这可以通过使用存储字符的最后找到索引的循环来更改。

在另一个循环中,将实际索引与相同字符的已存储索引进行比较,如果相等则返回。

function firstNonRepeatingLetter(str) {
    var lowerStr = str.toLowerCase(),
        hash = {},
        i;

    for (i = 0; i < lowerStr.length; i++)
        hash[lowerStr[i]] = i;

    for (i = 0; i < lowerStr.length; i++)
        if (hash[lowerStr[i]] === i)
            return str[i];

    return "";
}

console.log(firstNonRepeatingLetter('a'));      // a
console.log(firstNonRepeatingLetter('stress')); // t
console.log(firstNonRepeatingLetter('sTreSS')); // T

答案 1 :(得分:2)

是的,要回答这个问题,可以对字符串使用for..in。事实是,在大多数情况下,您不应该这样做。

for(i in X)的工作方式如下:

  • 如果X不是对象,则将其转换为相应的包装器(将数字转换为Number,将字符串转换为String
  • 对于X的每个“可枚举属性”,将其名称分配给i并运行循环主体

因此,字符串将转换为String对象,就像您在控制台中看到的那样,它们就像数组一样:它们具有从0到长度-1的数字属性,并且每个属性都包含各自的字符:< / p>

enter image description here

也就是说,上面的逻辑在字符串上可以正常工作。

但是,如果您只想逐个字符地迭代字符串,则有一种更直接的方法可以执行此操作:for..of循环。

for(a of X)从X(可以是字符串,数组或任何“可迭代”对象)中选择每个元素(不是属性),并将其分配给“ a”。使用for..of,可以像这样重构代码:

function firstNonRepeatingLetter(str) {
    const lowerStr = str.toLowerCase();

    for (let char of lowerStr) {
        if (lowerStr.lastIndexOf(char) === lowerStr.indexOf(char))
            return char;
    }

    return "";
}

答案 2 :(得分:1)

使用app.Use((context, next) => { context.Request.Scheme = "https"; return next(); }); 的算法方法: 是的,将javascript maps与字符串配合使用会很好。

for loops

答案 3 :(得分:1)

使用两个数组怎么样?首先,您可以使用split制作数组,也可以创建反向数组。

const origin = str.split('');
const reverse = [...origin].reverse();

然后,您可以使用filter

const nonRepeats = origin.filter((ele, index) => ele !== reverse[index]);
return nonRepeats[0];

答案 4 :(得分:1)

为回答标题中的问题,for..in语句旨在迭代可枚举的对象属性(包括原型链中的成员)。虽然它在可迭代类型上“有效” ,但通常建议不要将其用作迭代数组状结构的方法,因为当您通常只看数字索引时,它会产生意想不到的结果。

例如,假设您稍后有polyfill功能或以其他方式修改String原型。

String.prototype.polyfill = () => {}
for(const prop in 'abc')
    console.log(prop)


编辑:糟糕。看来我们两个人同时到达了那里。然后我还要指出,正则表达式擅长解决此类问题。 regex 101

const firstNonRepeatingLetter = str => 
    (str && /(.)(?!.*?\1)/i.exec(str)[0]) || ''
    
;[
    'a',
    'stress',
    'sTreSS'
]
    .forEach(
        str => console.log(firstNonRepeatingLetter(str))
    )

答案 5 :(得分:0)

我认为,一旦您在找到此任务的网站上解决了答案,它就会向您显示其他答案,因此您可以看到其他方法。

回到问题-您可以通过.split()方法将字符串转换为数组。数组提供了许多有用的方法,例如.filter().map()等,可以用来代替for循环。