JavaScript-使用变量创建嵌套值

时间:2019-01-06 13:55:40

标签: javascript object variables key

function getLetterData(letter) {
    letterData[letter] = { 
        count: undefined ? 1 : letterData[letter]['count']++, 
        overlap: overlapValue(letter)
    };
}

function overlapValue(letter) {
    console.log(letter); 
    return overlapLetters.includes(letter);
}

大家好,我正在尝试运行一个简单的应用程序来跟踪用户指定字符串中字母的外观。我正在尝试在一个对象中组织数据,该对象记录当前字符串中字符的计数,以及是否有任何字符出现在先前的字符串中。如您在上面看到的,要获取计数,我正在检查是否存在值。如果不是,应返回1。如果计数值存在,则将其递增。我的问题是我无法从letterData [letter] ['count']中获取值;这导致TypeError:letterData [letter]未定义;无法访问其“计数”属性。

我被认为是我的字母变量未在此行上使用,而是程序试图读取letterData [letter] ['count'],就好像'letter'是文字字符串一样。要访问嵌套对象中带有变量的键,还需要做其他事情吗?我没有任何问题,让overlapValue()可以正确地使用变量进行评估。

1 个答案:

答案 0 :(得分:1)

undefined ? X : Y将始终评估Y,因为undefined虚假。

我认为您可能要检查是否已经存在letterData[letter],如果存在,请使用其count(加1),否则请使用1。为此,您可以这样做:

function getLetterData(letter) {
    letterData[letter] = { 
        count: letterData[letter] ? letterData[letter].count + 1 : 1, 
// ------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        overlap: overlapValue(letter)
    };
}

之所以起作用,是因为如果您以前从未见过letter,则letterData[letter]将产生undefined,但是如果您之前从未见过,它将是前一个对象。

请注意,这会丢失先前的letterData[letter].overlap值(如果重要)。从这个问题尚不清楚,您是想要第一个重叠还是最后一个重叠,但是上面的内容将为您提供最后一个重叠。

如果要第一个,则更新前一个对象而不是替换它:

function getLetterData(letter) {
    const entry = letterData[letter];
    if (entry) {
        ++entry.count;
    } else {
        letterData[letter] = { 
            count: 1,
            overlap: overlapValue(letter)
        };
    }
}