我正在尝试创建一个对象映射,以供以下代码使用:
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;
}
而且我不能说出为什么顶部代码不会设置地图而底部代码可以设置地图。
答案 0 :(得分:3)
执行此操作时:
emoMap[EMOJI_WONDER]=EMOJI_WONDER;
您将EMOJI_WONDER
用作属性的键(名称)及其值。属性名称只能是字符串或符号,而不能是对象。因此,执行此操作时,EMOJI_WONDER
被强制转换为字符串以形成属性名称。由于您的所有对象都是普通对象,因此它们都强制转换为同一字符串:"[object Object]"
。这就是为什么您的emoMap
仅拥有一个属性的原因。
也许您打算将变量名用作属性名:
emoMap.EMOJI_WONDER = EMOJI_WONDER;
// or
emoMap["EMOJI_WONDER"] = EMOJI_WONDER;
否则,您可能需要一个数组或Set
。
答案 1 :(得分:2)
您已将变量对象作为对象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);
答案 2 :(得分:0)
大写情况是:
将 .toString()
用作键之前,在MARKED
,EMOJI_WONDER
和EMOJI_WIN
上被调用。因此,所有分配都加载到同一密钥上。即:'[object Object]'
。
因此,在打印时输出为:
{
'[object Object]': {
className: 'emoji',
img: ''
}
}
最终分配(EMOJI_WIN
)