JavaScript - создание вложенного значения с использованием переменной - PullRequest
0 голосов
/ 06 января 2019
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] не определено; не может получить доступ к свойству "count".

Меня убеждают, что моя переменная letter не используется в этой строке, и вместо этого программа пытается прочитать letterData [letter] ['count'], как будто 'letter' является литеральной строкой. Есть ли что-то еще, что нужно сделать, чтобы получить доступ к ключу с переменной внутри вложенного объекта? У меня нет проблем с получением overlapValue () для правильной оценки с использованием переменной.

1 Ответ

0 голосов
/ 06 января 2019

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)
    };
}

Это работает, потому что если вы никогда не видели 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)
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...