在onclick期间无法从javascript对象获取值(返回未定义)
好的,我有一个变量在onclick期间无法从javascript对象获取值(返回未定义),javascript,jquery,Javascript,Jquery,好的,我有一个变量eventMap,它是一个JavaScript对象,它本身包含对象 我有一个onclick函数,如图所示: if (localStorage.cal) { var dat = JSON.parse(localStorage.cal); console.log(dat); eventMap = dat.map; eventList = dat.list;
eventMap
,它是一个JavaScript对象,它本身包含对象
我有一个onclick函数,如图所示:
if (localStorage.cal) {
var dat = JSON.parse(localStorage.cal);
console.log(dat);
eventMap = dat.map;
eventList = dat.list;
}
$(delAppearance).on('click', function(){
if (lastKey && eventMap[lastKey]) {
var e = eventMap[lastKey];
eventList[lastKey] = undefined;
delete eventList[lastKey];
calObj.removeEvents(function(event){
return new Date(event.date).toUTCString() == moment(lastKey)._d.toUTCString();
});
localStorage.cal = JSON.stringify({list:eventList, map:eventMap});
lastKey = null;
$(delAppearance).hide();
}
});
因此,最后一个键当前设置为2017年6月20日。2017年6月20日的eventMap
中有一条记录(请看下图);由于某种原因,当我尝试访问eventMap[lastKey]
时,我得到了未定义的,无法进入该函数(查看if(lastKey&&eventMap[lastKey])
任何帮助都将不胜感激
更新
因此,它似乎来自于:
var calClick = function(target){
clearState();
var d = new Date(target.date._d);
var prettyDate = ((d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear());
var hr = new Date().getHours();
var min = new Date().getMinutes();
$(aDate).val(prettyDate);
var s;
console.log(target);
if (s = eventMap[prettyDate]) {
lastKey = prettyDate;
$(delAppearance).show();
setCurrentState(s);
}
}
它从未到达此处的最后一个键。但似乎是同一个问题。我必须以错误的方式访问eventMap。JavaScript中的哈希代码与Java或C#不同。每个对象都有自己的哈希键,并且不存在一致性
当您将JSON解析为eventMap时,您正在创建一个对象“06/20/2017”的实例(不确定代码中的类型,可能是日期?)
当您试图访问eventList[lastKey]时,您正在使用另一个类似于“06/20/2017”的对象实例
代码胜过千言万语:
let d1 = new Date(2017, 5, 20);
let d2 = new Date(2017, 5, 20);
// d1 and d2 are different instances. even though they look the same.
let mapObject = {};
mapObject[d1] = "some value";
console.debug(mapObject[d1]); // Will print 'some value'
console.debug(mapObject[d2]); // Will print null
d2 = d1; // Now let's make d2 the same instance as d1
console.debug(mapObject[d2]); // Will now print the *expected* 'some value'
如果要使用另一个实例访问映射,则需要实现一个标识映射,以确保在对象根据定义为“相等”或“相等”时始终返回相同的实例
或者,您可以确保将原始对象指定给lastKey,而不是指定新实例
我推荐后者。JavaScript中的哈希代码与Java或C#不相似。每个对象都有自己的哈希键,并且与相等性不一致
当您将JSON解析为eventMap时,您正在创建一个对象“06/20/2017”的实例(不确定代码中的类型,可能是日期?)
当您试图访问eventList[lastKey]时,您正在使用另一个类似于“06/20/2017”的对象实例
代码胜过千言万语:
let d1 = new Date(2017, 5, 20);
let d2 = new Date(2017, 5, 20);
// d1 and d2 are different instances. even though they look the same.
let mapObject = {};
mapObject[d1] = "some value";
console.debug(mapObject[d1]); // Will print 'some value'
console.debug(mapObject[d2]); // Will print null
d2 = d1; // Now let's make d2 the same instance as d1
console.debug(mapObject[d2]); // Will now print the *expected* 'some value'
如果要使用另一个实例访问映射,则需要实现一个标识映射,以确保在对象根据定义为“相等”或“相等”时始终返回相同的实例
或者,您可以确保将原始对象指定给lastKey,而不是指定新实例
我建议使用后者。您在哪里为地图对象分配eventMap?@mjw fixed Question是定义的最后一个键吗?@MBurnham我认为这与lastKey的ill post code有关。lastKey是如何获得其值的?特别是,是否从内部数据为其分配了值。地图?您在哪里为地图对象分配eventMap?@mjw fixed Question是最后一个key已定义?@MBurnham我认为这与lastKey的错误post代码有关。lastKey是如何获得其值的?特别是,它是否从内部数据.map中分配了一个值?但当我执行console.log(eventMap)时,它会显示对象,但当我执行console.log(eventMap)时,它会显示对象