传入ForEach的价值未定义

时间:2017-10-24 01:02:12

标签: javascript arrays string foreach

我使用下面的代码尝试找到序列中的第一个重复字符。当我在浏览器中运行代码并在控制台中使用letterArray.forEach函数将其停止时,控制台日志错误表明我对forEach的输入未定义。但在我看来,对于每个应该只是一次从letterArray中获取一个输入,看看它们是否相等,并返回结果。有人知道为什么它说我的forEach循环不能读取来自我的letterArray的输入吗?

function firstNotRepeatingCharacter(string) {

    var letterArray = [];
    letterArray['a'] = 0;
    letterArray['b'] = 0;
    letterArray['c'] = 0;
    letterArray['d'] = 0;
    letterArray['e'] = 0;
    letterArray['f'] = 0;
    letterArray['g'] = 0;
    letterArray['h'] = 0;
    letterArray['i'] = 0;
    letterArray['j'] = 0;
    letterArray['k'] = 0;
    letterArray['l'] = 0;
    letterArray['m'] = 0;
    letterArray['n'] = 0;
    letterArray['o'] = 0;
    letterArray['p'] = 0;
    letterArray['q'] = 0;
    letterArray['r'] = 0;
    letterArray['s'] = 0;
    letterArray['t'] = 0;
    letterArray['u'] = 0;
    letterArray['v'] = 0;
    letterArray['w'] = 0;
    letterArray['x'] = 0;
    letterArray['y'] = 0;
    letterArray['z'] = 0;
    for(var letter of string) {
      letterArray[letter] = letterArray[letter] + 1;
    }
    letterArray.forEach(function(value, index, thearay) {
      if (value == 1) {
        console.log(index);
      }
    });
}
var tester = "abacabad";
firstNotRepeatingCharacter(tester);

1 个答案:

答案 0 :(得分:2)

您所需代码的最小更改如下(请参阅代码中的注释// ******



function firstNotRepeatingCharacter(string) {
    // *********** change to Object
    var letterArray = {};
    letterArray['a'] = 0;
    letterArray['b'] = 0;
    letterArray['c'] = 0;
    letterArray['d'] = 0;
    letterArray['e'] = 0;
    letterArray['f'] = 0;
    letterArray['g'] = 0;
    letterArray['h'] = 0;
    letterArray['i'] = 0;
    letterArray['j'] = 0;
    letterArray['k'] = 0;
    letterArray['l'] = 0;
    letterArray['m'] = 0;
    letterArray['n'] = 0;
    letterArray['o'] = 0;
    letterArray['p'] = 0;
    letterArray['q'] = 0;
    letterArray['r'] = 0;
    letterArray['s'] = 0;
    letterArray['t'] = 0;
    letterArray['u'] = 0;
    letterArray['v'] = 0;
    letterArray['w'] = 0;
    letterArray['x'] = 0;
    letterArray['y'] = 0;
    letterArray['z'] = 0;
    for(var letter of string) {
      letterArray[letter] = letterArray[letter] + 1;
    }
    // *********** an object has no forEach, 
    //             so, we now need to iterate through the keys 
    //             (a,b,c ...) of the object, 
    //             that's where Object.keys helps
    Object.keys(letterArray).forEach(function(key, index, thearay) {
        var value = letterArray[key]; //the value is letterArray[key]
        if (value == 1) {
            console.log(key);
        }
    });
}
var tester = "abacabad";
firstNotRepeatingCharacter(tester);




然而,看看函数的名称,我希望

firstNotRepeatingCharacter("abacabad"); // c
firstNotRepeatingCharacter("abadacad"); // d

如果是这样,代码会更简单



function firstNotRepeatingCharacter(string) {
    for (let i = 0; i < string.length; i++) {
        if (string.split(string[i]).length == 2) {
            return string[i];
        }
    }
    return null;
}
console.log(firstNotRepeatingCharacter("abacadab"));
console.log(firstNotRepeatingCharacter("abadacab"));
&#13;
&#13;
&#13;