【问题标题】:JavaScript - Creating a nested value using a variableJavaScript - 使用变量创建嵌套值
【发布时间】:2019-01-06 13:55:40
【问题描述】:
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。如果 count 上存在一个值,则递增。我的问题是我无法从 letterData[letter]['count'];这会导致 TypeError: letterData[letter] is undefined;无法访问其“count”属性。

我被引导相信我的 letter 变量没有在这一行上使用,而是程序试图读取 letterData[letter]['count'],就好像 'letter' 是一个文字字符串。是否必须做其他事情才能访问嵌套对象中带有变量的键?我没有任何问题让overlapValue() 正确评估使用变量。

【问题讨论】:

  • 欢迎。 undefined ? 1 : letterData[letter]['count']++ 中的三元运算符有什么意义?它永远不会评估为 1。此外,letterDataoverlapLetters 定义在哪里?发布一个完整的样本会更好。

标签: javascript object variables key


【解决方案1】:

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

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

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

之所以有效,是因为如果您以前从未见过letterletterData[letter] 将导致undefined,但如果您以前见过它,它将是前一个对象。

请注意,这会丢失之前的 letterData[letter].overlap 值(如果重要的话)。从这个问题中不清楚你是想要第一个重叠还是最后一个重叠,但上面会给你最后一个。

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

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

【讨论】:

  • 谢谢 T.J.,检查 letterData[letter] 而不是 undefined 有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2022-10-21
  • 2011-12-15
相关资源
最近更新 更多