создание объекта карты - PullRequest
       1

создание объекта карты

0 голосов
/ 29 сентября 2018

Я пытаюсь создать карту объектов для использования с помощью следующего кода:

var MARKED ={className: 'emoji', img:'⚐'} ;
var EMOJI_WONDER = {className: 'emoji', img: '?'};
var EMOJI_WIN = {className: 'emoji', img: '?'};

var emoMap={};
emoMap[EMOJI_WONDER]=EMOJI_WONDER;
emoMap[MARKED]=MARKED;
emoMap[EMOJI_WIN]=EMOJI_WIN;
console.log(emoMap);

и я получаю объект объекта.Раньше я делал карту со следующим кодом:

var str = 'this is a test la la la la lo';
var wordMap = countWordApperances(str);
console.log(str, 'got: ', wordMap);

function countWordApperances(txt) {
    var wordCountMap = {};
    
    var words = txt.split(' ');
    
    for (var i = 0; i < words.length; i++) {
        var currWord = words[i];
        if (wordCountMap[currWord]) wordCountMap[currWord]++;
        else wordCountMap[currWord] = 1;

    }
    return wordCountMap;
}

и я просто не могу сказать, почему верхний код не устанавливает карту, а нижний код это делает.

Ответы [ 3 ]

0 голосов
/ 29 сентября 2018

Когда вы делаете это:

emoMap[EMOJI_WONDER]=EMOJI_WONDER;

вы используете EMOJI_WONDER как ключ (имя) свойства и его значение.Имена свойств могут быть только строками или символами, они не могут быть объектами.Поэтому, когда вы делаете это, EMOJI_WONDER приводится к строке, чтобы сформировать имя свойства.Поскольку все ваши объекты являются простыми объектами, все они приводятся к одной и той же строке: "[object Object]".Вот почему ваш emoMap заканчивается только одним свойством.

Возможно, вы хотели использовать имена переменных в качестве имен свойств:

emoMap.EMOJI_WONDER = EMOJI_WONDER;
// or
emoMap["EMOJI_WONDER"] = EMOJI_WONDER;

Если нет, вам, вероятно, нужен массив илиSet.

0 голосов
/ 29 сентября 2018

В верхнем регистре происходит то, что:

.toString() вызывается и на MARKED, EMOJI_WONDER и EMOJI_WIN перед использованием его в качестве ключа.Поэтому все назначения загружаются по одному и тому же ключу.А именно: '[object Object]'.

Следовательно, при печати вывод:

{
    '[object Object]': {
        className: 'emoji',
        img: '?'
    }
}

Окончательное назначение (EMOJI_WIN)

0 голосов
/ 29 сентября 2018

Вы передаете переменный объект в качестве ключа для объекта emoMap, вам нужно вместо него использовать строку

var MARKED ={className: 'emoji', img:'⚐'} ;
var EMOJI_WONDER = {className: 'emoji', img: '?'};
var EMOJI_WIN = {className: 'emoji', img: '?'};

var emoMap={};
emoMap["EMOJI_WONDER"]=EMOJI_WONDER;//add quote to make it work
emoMap["MARKED"]=MARKED;
emoMap["EMOJI_WIN"]=EMOJI_WIN;
console.log(emoMap);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...