Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在onclick期间无法从javascript对象获取值(返回未定义)_Javascript_Jquery - Fatal编程技术网

在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)时,它会显示对象